快速业务通道

BCB编写DLL终极手册

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
是检查应用程序的 MainForm 是否为 fsMDIForm 的窗体,这样只

要把调用程序的 Application 的 Handle 传递给 DLL 的 Application 即可;同时退出 DLL 时也要恢复

Application
// 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 编译成功

五. 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

使用 extern "C" 不会分解函数名

使用 Impdef MyLib.def MyLib.DLL 生成 def 文件查看是否使用了名字分解

2. 调用约定:

__cdecl 缺省

是 Borland C++ 的缺省的 C 格式命名约定,它在标识符前加一下划线,以保留

它原来所有的全程标识符。参数按最右边参数优先的原则传递给栈,然后清栈。

extaern "C" bool __cdecl TestFunction();

在 def 文件中显示为

TestFunction @1

注释: @1 表示函数的顺序数,将在“使用别名”时使用。

__pascal Pascal格式

这时函数名全部变成大写,第一个参数先压栈,然后清栈。

TESTFUNCTION @1 //def file

__stdcall 标准调用

最后一个参数先压栈,然后清栈。

TestFunction @1 //def file

__fastcall 把参数传递给寄存器

第一个参数先压栈,然后清栈。

@TestFunction @1 //def file

3. 解决调用约定:

Microsoft 与 Borland 的 __stdcall 之间的区别是命名方式。 Borland 采用

__stdcall 的方式去掉了名字起前的下划线。 Microsoft 则是在前加上下划线,在

后加上 @ ,再后跟为栈保留的字节数。字节数取决于参数在栈所占的空间。每一个参数都舍入为 4 的倍数加起来。这种 Miocrosoft 的 DLL 与系统的 DLL 不一样。

4. 使用别名:

使用别名的目的是使调用文件 .OBJ 与 DLL 的 .DEF 文件相匹配。如果还没有

.DEF 文件,就应该先建一个。然后把 DEF 文件加入 Project。使用别名应不断

修改外部错误,如果没有,还需要将 IMPORTS 部分加入 DEF 文件。

IMPORTS

TESTFUNCTIOM4 = DLLprj.TestFunction4

TESTFUNCTIOM5 = DLLprj.WEP @500

TESTFUNCTIOM6 = DLLprj.GETHOSTBYADDR @51

这里需要说明的是,调用应用程序的 .OBJ 名与 DLL 的 .DEF 文件名是等价的,

而且总是这样。甚至不用考虑调用约定,它会自动匹配。在前面的例子中,函数被

说明为 __pascal,因此产生了大写函数名。这样链接程序不会出错。

5. ?ˉì?μ÷ó?ày×ó

VC DLL μ?′ú??è???£o

extern "C" __declspec(dllexport) LPSTR __stdcall BCBLoadVCWin32Stdcall()
{
static char strRetStdca

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号