создание и работа с dll фалами

 
0
 
C++
ava
Kirill89 | 23.01.2009, 19:51
Доброе время суток.
Я недавно столкнулся с задачей и никак не могу разобраться как её реализовать, очень прошу мне помочь.
Есть некоторая программа на C#, мне нужно написать и использовать в ней dll файл, на C++, который будет содержать функцию по чтению файла (текстового), с параметром (путь к файлу) и возвращать значение string (содержимое фала). и аналогично по записи в файл.
Вопросы такие:
1) как сделать рабочий dll файл, используя visual studio 2005 и синтаксис С++?
2) как этот файл подключить к c# или visual basic?
3) как осуществить работу с файлами и текстовой строкой в таком dll?

Буду очень благодарен, особенно если с примером и инструкцией =)
Ответы (6)
ava
GoldFinch | 23.01.2009, 20:03 #
начни с F1 там все написано
ava
Kirill89 | 23.01.2009, 20:40 #
GoldFinch, забавно, может ещё пример покажешь?
Я же не для прикола спрашиваю. Такой пример не должен занять много времени, а это мне ОЧЕНЬ поможет разобраться.
ava
Rififi | 23.01.2009, 21:28 #
Kirill89,
1. www.google.ru => "c++ dll example"
2. www.google.ru => "c# c++ p/invoke"
3. www.google.ru => "c# c++ p/invoke"
ava
shara | 23.01.2009, 23:12 #
в общем расскажу как делал я, правда насчет С# ничего не знаю я с этим зверем не сталкивался.

создаем ДЛЛину для этого в MsVC2008 (звыняй 2005 нету  :biggrin ) давим на следующие кнопы: File -> New -> Project -> Win32Project. В запустившемся визарде в зависимости от нужд выбираем то что нас интерисует, в нашем случае выбираем DLL.

считай пол пути уже есть. Теперь тебе нужно описать функцию DllMain - эта функция вызывается с параметром ul_reason_for_call = DLL_PROCESS_ATTACH и тебе  нужно обработать его, это так называемая инициализация библиотеки.  похожий параметр (DLL_PROCESS_DETACH) функция DllMain принимает и перед тем как библиотека будет выгружаться из памяти.
Все остальные функции описываешь как в обычной программе, с класами не работал - но они тебе покаместь и не нужы.
Для того чтобы другие приложения могли вызывать функции из твоей библиотеки тебе в проекте нужно будет создать *.def файл в котором нужно показать компилятору какие функции будут видны вне библиотеки. Выглядит он приблизительно так 

LIBRARY   MyDll
EXPORTS
   Func_1   @1
   Func_2   @2
   Func_3   @3
   MySuperFunc   @4



собсно и все. Компилим библиотеку.

Чтобы подгрузить свою ДЛЛ к проге использем LoadLibrary.
но тебе еще нужно узнать адреса функций находящихся в библиотеке, это делается так:

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...

HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
DWORD dwParam1;
UINT  uParam2, uReturnVal;

hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                           "DLLFunc1");
   if (!lpfnDllFunc1)
   {
      // handle the error
      FreeLibrary(hDLL);
      return SOME_ERROR_CODE;
   }
   else
   {
      // call the function
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
   }
}



и еще, чувак если с англиqским не проблема - не ленись юзать MSDN




 
ava
Kirill89 | 24.01.2009, 00:15 #
shara, во, большое спасибо!
dll получилась, но как её подключить...? через add->existing item не получилось - программа не видит функций.

Добавлено позднее:
разобрался. всем спасибо.
ava
shara | 24.01.2009, 00:23 #
Kirill89,
you are wellcom   smile 
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить