win7 下BCB调用 BCB编写的DLL

win7 下BCB调用 BCB编写的DLL,第1张

1. 静态调用 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

}

2. 动态调用 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)

}

3. DLL 作为 MDIChild (子窗体) 【只编写动态调用的例子】

实际上,调用子窗体的 DLL 时,系统只困梁是检查应蔽尺肆用程序的 MainForm 是否为 fsMDIForm 的窗体,这样只要把调用程序的 Application 的 Handle 传递给 DLL 的 Application 即可;同时退出 DLL 时也要恢复

// MDIChildPro.cpp // Dll 实现 CPP

#include "unit1.h" // TForm1 定义

TApplication *SaveApp = NULL

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)

{

if ( (reason==DLL_PROCESS_DETACH) &&SaveApp )

Application = SaveApp // 恢复 Application

return 1

}

extern "C" __declspec(dllexport) __stdcall void TestMDIChild(

//1024X768

TApplication* mainApp,

LPSTR lpCaption)

{

if ( NULL == SaveApp ) // 保存 Application,传递 Application

{

SaveApp = Application

Application = mainApp

}

// lpCaption 为子窗体的 Caption

TForm1 *Form1 = new TForm1 ( Application, lpCaption )

Form1->Show()

}

注:上面的程序使用 BCB 3.0 编译成功

4. BCB 调用 VC 编写的 DLL

1. 名字分解

没有名字分解的函数

TestFunction1 // __cdecl calling convention

@TestFunction2 // __fastcall calling convention

TESTFUNCTION3 // __pascal calling convention

TestFunction4 // __stdcall calling convention

有名字分解的函数

@TestFunction1$QV // __cdecl calling convention

@TestFunction2$qv // __fastcall calling convention

TESTFUNCTION3$qqrv // __apscal calling convention

@TestFunction4$qqrv // __stdcall calling convention<br

获取当前目录的方法有很多,其中之一:

TCHAR szFilePath[MAX_PATH + 1]

GetModuleFileName(NULL, szFilePath, MAX_PATH)

(_tcsrchr(szFilePath, _T('//')))[1] = 0//删除族老拍兆羡文件名,只获得路径

CString str_url = szFilePath //str_url 中保存的是含誉当前目录


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12302503.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存