关于DLL动态调用

liuhaimo 2004-10-11 10:48:42
我用静态调用时,可以显示出Form,可是动态调用时,就说找不到DLL中函数的指针,onClick事件代码如下:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE hInst;
if(hInst == NULL)
{
hInst = LoadLibrary("Project2.dll");
}
if (hInst!=NULL)
{
(FARPROC &)displayForm = GetProcAddress(hInst,"inputinterface");
if (displayForm!=NULL)
{
displayForm();
}
else
{
ShowMessage("无法获取调用函数的指针");
} }
else
{
ShowMessage("无法载入DLL文件");
}
//TForm2* temp = new TForm2(NULL);之前用的静态调用
//temp->inputinterface();之前用的静态调用
}
...全文
198 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuhaimo 2004-10-11
  • 打赏
  • 举报
回复
我是个新手,第一次接触DLL,还请大家多多指教。
liuhaimo 2004-10-11
  • 打赏
  • 举报
回复
DLL 文件的

.h

class __declspec(dllexport) __stdcall TForm2 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
private: // User declarations
public: // User declarations
__fastcall TForm2(TComponent* Owner);
void inputinterface();
};

.cpp

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void TForm2::inputinterface()
{
this->Show();
}

调用程序的DLL声明

class __declspec(dllimport) __stdcall TForm2 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
private: // User declarations
public: // User declarations
__fastcall TForm2(TComponent* Owner);
void inputinterface();
};
wiseyao 2004-10-11
  • 打赏
  • 举报
回复
(FARPROC &)displayForm = GetProcAddress(hInst,"inputinterface");
应该改为:
displayForm = (inputinterface声明的原形的函数指针类型)GetProcAddress(hInst,"inputinterface");
wiseyao 2004-10-11
  • 打赏
  • 举报
回复
(FARPROC &)displayForm = GetProcAddress(hInst,"inputinterface");
应该改为:
displayForm = (inputinterface声明的原形)GetProcAddress(hInst,"inputinterface");
liuhaimo 2004-10-11
  • 打赏
  • 举报
回复
TDump.exe在哪?
Lewolf 2004-10-11
  • 打赏
  • 举报
回复
inputinterface函数是什么调用规则,__stdcall、__fastcall等是不一样的,你可以看看导出函数的名称是什么,使用TDump.exe可以察看Project2.dll的导出函数的名称
Friecin 2004-10-11
  • 打赏
  • 举报
回复
导出函数:extern "C" __declspec(dllexport) ExportType FunctionName(Parameter)
导出类:class __declspec(dllexport) ExportType ClassName{...}
例子:(说明:只是生成了一个 DLL.dll )

#include "DllForm.h" // TDllFrm 定义

USERES("Dll.res");
USEFORM("DllForm.cpp", DllFrm);

class __declspec(dllexport) __stdcall MyDllClass { //导出类
public:
MyDllClass();
void CreateAForm();
TDllFrm* DllMyForm;
};

TDllFrm* DllMyForm2;
extern "C" __declspec(dllexport) __stdcall void CreateFromFunct();//导出函数

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

MyDllClass::MyDllClass()
{
}

void MyDllClass::CreateAForm()
{
DllMyForm = new TDllFrm(Application);
DllMyForm->Show();
}
//---------------------------------------------------------------------------
void __stdcall CreateFromFunct()
{
DllMyForm2 = new TDllFrm(Application);
DllMyForm2->Show();
}


二. 静态调用 DLL
使用 $BCB path\Bin\implib.exe 生成 Lib 文件,加入到工程文件中
将该文件拷贝到当前目录,使用 implib MyDll.lib MyDll.dll 生成
// Unit1.h // TForm1 定义
#include "DllForm.h" // TDllFrm 定义
//---------------------------------------------------------------------------

__declspec(dllimport) class __stdcall MyDllClass {
public:
MyDllClass();
void CreateAForm();
TDllFrm* DllMyForm;
};
extern "C" __declspec(dllimport) __stdcall void CreateFromFunct();

class TForm1 : public TForm{...}


// Unit1.cpp // TForm1 实现
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // 导出类实现,导出类只能使用静态方式调用
DllClass = new MyDllClass();
DllClass->CreateAForm();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // 导出函数实现
CreateFromFunct();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete DllClass;
}

三. 动态调用 DLL
// Unit1.h
class TForm1 : public TForm
{
...
private: // User declarations
void (__stdcall *CreateFromFunct)();
...
}

// Unit1.cpp // TForm1
HINSTANCE DLLInst = NULL;
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if( NULL == DLLInst ) DLLInst = LoadLibrary("DLL.dll"); //上面的 Dll
if (DLLInst) {
CreateFromFunct = (void (__stdcall*)()) GetProcAddress(DLLInst,
"CreateFromFunct");
if (CreateFromFunct) CreateFromFunct();
else ShowMessage("Could not obtain function pointer");
}
else ShowMessage("Could not load DLL.dll");
}

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if ( DLLInst ) FreeLibrary (DLLInst);
}

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧