首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

为什么BCB 调Dll这么麻烦,请

2012-04-08 
为什么BCB 调Dll这么麻烦,请大家帮忙看看啊!别人写的DLL,有头文件,有VC的lib文件,就是没有办法正确调用。我

为什么BCB 调Dll这么麻烦,请大家帮忙看看啊!
别人写的DLL,有头文件,有VC的lib文件,就是没有办法正确调用。
我首先使用静态调用,方法如下.
1.将LIB文件 add to project 
2.#include "MyDll.h";
后编译出错,提示 contains invalid OMF record, type 0x21 (possibly COFF)
然后我上网查,说要使用implib MyDll.lib MyDll.dll 导出的LIB

之后我使用implib导出了LIB并放在当前路径下
编译又报错
[Linker Error] Unresolved external 'ShowForm()' referenced from c:\a\UNIT1.OBJ
有点晕了

然后我使用动态调用,但因为这个dll的函数要在许多的窗体调用,所以我想将其定义在一个单元中。代码如下

C/C++ code
//头文件Unit2.h里//---------------------------------------[code=C/C++]#ifndef Unit2H#define Unit2H#include <StdCtrls.hpp>char * _stdcall    (*ShowForm)(char *);double    (*Add)(double x ,double y);void loadDll();HINSTANCE hInst=NULL;//---------------------------------------#endif//源文件Unit2.h里#pragma hdrstop#include "Unit2.h"//---------------------------------------#pragma package(smart_init)void loadDll() {   hInst = LoadLibrary("MyDll.DLL");  if(hInst)  {    (FARPROC &)ShowForm=GetProcAddress(hInst,"ShowForm" );    (FARPROC &)Add=GetProcAddress(hInst,"Add" ); } else { //  MessageBox(Handle,"无法加载DllServer.dll文件","信息提示",MB_OK);   FreeLibrary(hInst);  } }

之后在窗体中调用,但是会出错
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  loadDll();
  ShowForm(Edit1->Text.c_str());
}[/code]

但是将源文件中的代码放在窗体Unit1单元中执行一次就没有问题,可以正常使用,这是什么原因?(虽然在窗体1中可以正常使用,但在窗体2中还是不能正常调用)
我彻底晕了!

[解决办法]
1.VC的lib与BCB格式不同,不能直接调用,用implib是可以的,但可能要加-a参数
2.动态调用时
1)你最好判一下GetProcAddress返回值,如果函数找不到,会出错的
2)你的程序有问题:
void loadDll()
 {
hInst = LoadLibrary("MyDll.DLL"); //第二次又重新加载
if(hInst)
{
(FARPROC &)ShowForm=GetProcAddress(hInst,"ShowForm" );
(FARPROC &)Add=GetProcAddress(hInst,"Add" );

 }
 else //这个else也有问题
 {
 // MessageBox(Handle,"无法加载DllServer.dll文件","信息提示",MB_OK);
FreeLibrary(hInst); //这个很有问题,这里hInst=NULL,当然错
}
 }
改一下:
void loadDll()
 {
if(hInst==NULL)
{
hInst = LoadLibrary("MyDll.DLL");
if ( hInst)
{
(FARPROC &)ShowForm=GetProcAddress(hInst,"ShowForm" );
if (ShowForm==NULL)
::MessageBox(NULL,"无法找到ShowForm函数","信息提示",MB_OK);
(FARPROC &)Add=GetProcAddress(hInst,"Add" );
if (Add==NULL)
::MessageBox(NULL,"无法找到Add函数","信息提示",MB_OK);

else
::MessageBox(NULL,"无法加载DllServer.dll文件","信息提示",MB_OK);
 }
3)注意函数的定义(要与VC相同)特别是调用方式(_stdcall,_cdecl)

[解决办法]
探讨

谢谢你的回复,静态调用成功,原来是要修改VC版的头文件,也就是你所说的3)。

根据BCB编写DLL终极手册上的写法,使用imdef 生成Ref文件,然后做相应的修改

但运态调用作了以上修改后依然失败,还是同开始一样,当void loadDll()写在窗体代码中时,可以正常调用,但是写在非窗体中则调用失败,调用DLL中的函数没有指向正确的位置.
而且在一个窗体中运行过Void loa……

[解决办法]
C++Builder及VC的DLL相互调用
http://topic.csdn.net/u/20090302/17/99d1fbc5-4be6-4744-96d9-09b16c0d93c3.html?22391

热点排行