Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > dll в c++builder


Автор: kuzia 23.5.2003, 15:56
Здравствуйте все!
Помогите, пожалста. Создаю dll в c++builder. Помещаю в нее 1 функцию:
h-файл:

#ifndef UNIT1H
#define UNIT1H

#include <windows.h>

extern "C" __declspec(dllexport) double minus(double x1, double x2);

#endif

cpp-файл:

#include <windows.h>
//-------------------------------------------------------------------------
extern "C" __declspec(dllexport) double minus(double x1, double x2)
{
return x1 - x2;
}
//---------------------------------------------------------------------------

Создаю тестирующее приложение:
//---------------------------------------------------------------------------

#include <windows.h>
#include <iostream.h>

typedef double(*MyFunc)(double, double);

int main(int argc, char* argv[])
{
HINSTANCE dllInstance = LoadLibrary("Project1.dll");

MyFunc Func;

Func = (MyFunc) GetProcAddress(dllInstance, "minus");

if(Func == NULL)
{
LPVOID lpMsgBuf;

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);


MessageBox( NULL, (const char*)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );

// Free the buffer.
LocalFree( lpMsgBuf );

}
else{

double x1, x2;
cin >> x1 >> x2;
cout << Func(x1, x2);
}
FreeLibrary(dllInstance);

return 0;
}
//---------------------------------------------------------------------------

Запускаю. Получаю "Не найдена указанная процедура".
Не понимаю, что происходит. Почему я получаю Func = NULL?
Ведь LoadLibrary("Project1.dll") сработал правильно, а функция объявлена так, как описано во всей литературе.

Автор: Vyacheslav 23.5.2003, 16:00
Поставь лидирующий знак подчеркивания в названии
Код

Func = (MyFunc) GetProcAddress(dllInstance, "_minus");


Автор: kuzia 23.5.2003, 16:04
спасибо, помогло smile.gif))

Автор: vickr 23.5.2003, 16:04
При указании спецификации вызова extern "C" происходит декорирование имени ф-и. Нужно:
Код

Func = (MyFunc) GetProcAddress(dllInstance, "_minus");

В общем случае список декорированных символов, экспортируемых dll, можно просмотреть утилитой dumpbin. Она вроде поставляется с MSVS6.

Автор: vickr 23.5.2003, 16:05
Упс, немного опоздал smile.gif

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