Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как вызвать функцию exe из dll


Автор: leporel 23.2.2011, 00:51
Есть программа с dll, которую сделал по статье

exe
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    void (*ShowF)();
    if (dllp)
    {
        ShowF = (void(*)())GetProcAddress(dllp, "_ShowF");
        if(ShowF) ShowF();
    }

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
dllp = LoadLibrary("Project2.dll");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
FreeLibrary(dllp);
}
//---------------------------------------------------------------------------

void funk()
{
    ShowMessage("ok");
}


dll
Код


int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
//---------------------------------------------------------------------------

extern "C" void _declspec(dllexport) ShowF()  {
    ShowMessage("Hello from dynamic DLL");
    }


Как вызвать функцию funk() в программе из dll?

Автор: borisbn 23.2.2011, 11:57
точно также. в данном контесте exe ничем не отличается от dll.
в exe делаешь 
Код

extern "C" void _declspec(dllexport) funk();
 
а в dll
Код

LoadLibrary("bla_bla_bla.exe");
GetProgAddress(..., "func" );
и т.д.

Автор: leporel 23.2.2011, 13:45
borisbn, Почему то мне пишет что функция не найдена. Я наверно ошибаюсь, но зачем опять писать LoadLibrary("bla_bla_bla.exe");, если требуется вызвать функцию в уже запущенной программе, я думал это делаеться что то вроде передачей указателя в dll на эту функцию.

Автор: Alexeis 23.2.2011, 15:50
Попробуйте оформить функцию как __stdcall , это влияет на декорацию имен при экспорте.

Автор: Abyx 23.2.2011, 15:54
вместо LoadLibrary("bla_bla_bla.exe"); 
- GetModuleHandle(0);

Автор: borisbn 23.2.2011, 15:56
Цитата(leporel @  23.2.2011,  13:45 Найти цитируемый пост)
Я наверно ошибаюсь, но зачем опять писать LoadLibrary("bla_bla_bla.exe");, если требуется вызвать функцию в уже запущенной программе, я думал это делаеться что то вроде передачей указателя в dll на эту функцию.

нет. не ошибаешься, просто я тебя не так понял. тогда так

в общем h-нике
Код

typedef void (*void_func_t)();

в dll-ке
Код

extern "C" void _declspec(dllexport) ShowF( void_func_t func )  {
    ShowMessage("Hello from dynamic DLL");
    func();
}


в exe-шнике
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    void (*ShowF)( void_func_t );
    if (dllp)
    {
        ShowF = (void(*)(void_func_t))GetProcAddress(dllp, "_ShowF");
        if(ShowF) ShowF( funk ); // или ShowF( &funk );
    }

}

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