Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Создание DLL


Автор: Mephisto 26.6.2007, 12:15
Вот, смотрю примеры по созданию dll. Чет не могу понять почему у меня ни один из примеров не работает...
Может кто подскажет что я не так делаю?
Вот единственный модуль в библиотеке:
Код

#include <windows.h>
#define EXPORT extern "C" __declspec (dllexport)

int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved)
{
    return TRUE;
}
EXPORT int CALLBACK MyFunction(char *str)
{
    MessageBox(NULL,str,"Function from DLL",MB_OK);
    return 1;
}


Вот как пытаюсь загрузить ее:
Код

    HINSTANCE hMyDll;
    if((hMyDll=LoadLibrary("TestDLL_NET"))==NULL) return;

    PFN_MyFunction pfnMyFunction;
    pfnMyFunction=(PFN_MyFunction)GetProcAddress(hMyDll,"MyFunction");
    int iCode=(*pfnMyFunction)("Maxim");

    FreeLibrary(hMyDll);
return;

В результате этот указатель пустой pfnMyFunction.

Автор: _hunter 26.6.2007, 12:20
посмотри depend'ом экспортируется эта функция или нет. возможно перед именем нужно "_" приписать

Автор: Mephisto 26.6.2007, 12:22
Цитата(_hunter @  26.6.2007,  13:20 Найти цитируемый пост)
посмотри depend'ом

 smile 
Где взять?

Автор: _hunter 26.6.2007, 12:25
он со студией идет (называется depends)... или DEPENDS.EXE поищи...

Автор: Alexeis 26.6.2007, 12:36
странное название для библиотеки "TestDLL_NET", может "TestDLL_NET.dll" ?

Автор: Mephisto 26.6.2007, 12:37
_hunter, отлично!!!!
Прокатило. Только теперь вопрос....
Почему он сделал название функции _MyFunction@4 smile

Добавлено через 42 секунды
Alexeis, так пошло. ТОлько название левое у функции

Автор: Daevaorn 26.6.2007, 12:49
Mephisto, Предлагаю темы создавать в соответствующих разделах.

Автор: Mephisto 26.6.2007, 12:57
Daevaorn, предложение принято. 

Автор: EnergoHokum 26.6.2007, 14:15
Потому что нужно имена функций, которые будут торчать наружу, объявлять как
Код

extern "C" __declspec(dllexport) retResult Function(Param param)
{

}

иначе компилятор для обеспечения перегружаемости (так вроде правильно smile) функции добавит спереди/сзади неё кодированную информацию о возвращаемых/передаваемых параметрах. Декорирование называется.

Автор: Mephisto 26.6.2007, 14:18
EnergoHokum, я же так и написал!  smile

Добавлено через 2 минуты и 39 секунд
Убрал CALLBACK и все нормально стало!

Добавлено через 3 минуты и 38 секунд
А как мона сделать out параметр???? 

Автор: EnergoHokum 26.6.2007, 14:55
Кто такой out-параметр? Переменная, которая торчит наружу? Можно создать её в общей памяти (SharedMemory), можно затолкать в руками созданную секцию (это от компилятора зависит), но лучше так не делать, а написать функцию, которая и будет твою переменную отдавать.

Автор: Mephisto 26.6.2007, 15:09
Цитата(EnergoHokum @  26.6.2007,  15:55 Найти цитируемый пост)
Можно создать её в общей памяти (SharedMemory), можно затолкать в руками созданную секцию (это от компилятора зависит), но лучше так не делать

Угу. СПС. ;) Я тож понил что так лучше не делать. 

Автор: WM_SASHA 26.6.2007, 23:31
а как можно оформить библиотечные функции с модификатором CALLBACK,чтобы при вызове не пришлось писать такого GetProcAddress(hInst," _function@12");  ?
к примеру это может потребоваться для программ на других языках.

Автор: 586 27.6.2007, 03:54
можно использовать def-файл, либо использовать опцию компилятора:
Код
#pragma comment (linker, "/export:function=_function@12")

Цитата
это может потребоваться для программ на других языках

???

Автор: Mephisto 27.6.2007, 08:49
Люди, есть такая функция
Код

EXPORT int CALLBACK MyFunction(char *str)
{
    MessageBox(NULL,str,"Function from DLL",MB_OK);
    return 1;
}

А как можна сделать чтоб передавать можно было б некий буфер. А функция внутри длл писала в него некую информацию? Чет неасиливаю. :( 

Автор: Mephisto 27.6.2007, 09:29
Вернее у меня получилось, но только вылазит вот такое сообщение... Это .нет
Цитата

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

Автор: _hunter 27.6.2007, 10:32
попробуй __cdecl вместо CALLBACK написать. хотя это на вызывающей стороне копать нужно...

Автор: Mephisto 27.6.2007, 11:06
Цитата(_hunter @  27.6.2007,  11:32 Найти цитируемый пост)
__cdecl 

ОК. СПС. Выручил!  smile 

Автор: WM_SASHA 6.7.2007, 09:39
а что такое def файл?как их использовать чтобы не пришлось писать так:

GetProcAdress(hDll,"_MyFunction@14");

когда нужно :

GetProcAdress(hDll,"MyFunction");

покажите пример . smile 

Автор: Mephisto 6.7.2007, 10:19
WM_SASHA, Я просто CALLBACK убрал и все вернулось в зад. Осталось прямое имя. def файл не делал...

Автор: WM_SASHA 7.7.2007, 05:55
Mephisto, ну а как с CALLBACK?мне это интересно

Автор: Mephisto 9.7.2007, 08:44
Я же писал:
Код

#include <windows.h>
#define EXPORT extern "C" __declspec (dllexport)
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved)
{
    return TRUE;
}
EXPORT int CALLBACK MyFunction(char *str)
{
    MessageBox(NULL,str,"Function from DLL",MB_OK);
    return 1;
}


Цитата

EXPORT int CALLBACK MyFunction(char *str)


Так к названию функции и дополнительная инфа прилагается. А так:

Цитата

EXPORT int  MyFunction(char *str)

Эфект тот же, но название ровное!

Автор: 586 9.7.2007, 13:20
Цитата(WM_SASHA @  7.7.2007,  06:55 Найти цитируемый пост)
ну а как с CALLBACK?мне это интересно 

Код
#include <windows.h>
#pragma comment (linker, "/def:test.def")  // опция линковщика

int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved)
{
    return TRUE;
}
int CALLBACK MyFunction(char *str)
{
    MessageBox(NULL,str,"Function from DLL",MB_OK);
    return 1;
}

def файл:
Код
LIBRARY test.dll
EXPORTS
MyFunction

За подробностями в MSDN.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)