BCB编写DLL终极手册
是检查应用程序的 MainForm 是否为 fsMDIForm 的窗体,这样只
要把调用程序的 Application 的 Handle 传递给 DLL 的 Application 即可;同时退出 DLL 时也要恢复
注:上面的程序使用 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
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |