为什么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)
[解决办法][解决办法]C++Builder及VC的DLL相互调用
http://topic.csdn.net/u/20090302/17/99d1fbc5-4be6-4744-96d9-09b16c0d93c3.html?22391