请高手回答,关于BCB动态调用vc编写的DLL的函数类型转换问题
本人用vc6编了DLL,已经用vc6做测试程序调通,bcb是初学,需要用来做界面,用动态的显式链接方法(Loadlibrary。。。),不过在bcb测试时无法发通指令,不知是不是因为bcb没有CString,而出现的类型转换问题
//dll函数
bool StartListen(char* ComName)
{
}
CString ConnectTogether(int MonitorNo, int CameraNo)
{
}
//bcb代码,(.cpp)中
typedef bool (* open)(char *);
typedef LPCTSTR (* check)(int,int);
FARPROC lpFarProc; //指向dll模块中函数地址的指针
int (*lpaddit)(int,int); //自己声明的一个和dll中的函数一样功能的函数原型
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
HINSTANCE DLLInst = NULL;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
bool r;
open p;
char result;
DLLInst = LoadLibrary("ComServer.dll");
p = (open)GetProcAddress(DLLInst,"StartListen");
if(p!=NULL)
{
r = p("COM1");
ShowMessage("ok");
if(r)
{ lpFarProc = GetProcAddress(DLLInst,"ConnectTogether");
if(lpFarProc!=NULL)
{
lpaddit = (int(_cdecl *)(int, int))lpFarProc; //指针类型转换
result = lpaddit(1,2);
ShowMessage("connect com");
}
else
ShowMessage("not com");
}
}
else ShowMessage("Could not obtain function pointer");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
FreeLibrary(DLLInst);
}
出错提示信息是("not com"),说明StartListen命令没有得到COM的值,希望高手指点,谢谢
如果我改为如下情况,返回的虽然是("okcom");不过没有指令代码
HINSTANCE DLLInst = NULL;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
bool r;
open p;
DLLInst = LoadLibrary("ComServer.dll");
p = (open)GetProcAddress(DLLInst,"StartListen");
if(p!=NULL)
{
r = p("COM1");
ShowMessage("ok");
if(r)
{
ShowMessage("okcom");
}
}
else ShowMessage("Could not obtain function pointer");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
FreeLibrary(DLLInst);
}
//---------------------------------------------------------------------------
希望能帮忙把两个函数都给调通,谢谢了
问题点数:80、回复次数:4Top
1 楼rainfall19831109(恩恩)回复于 2006-06-04 03:42:25 得分 0
本人认为,一个工具写出来的DLL提供给别的工具调用,使用的数据类型应以COM数据类型为好
函数StartListen,返回值建议使用BOOL而不要使用bool,我未试过用bool作为dll的返回值,所以不敢确定用bool是否会有错,但我一直用BOOL写DLL,在别的工具上多可以使用得好好的]
至于函数ConnectTogether更不用说啦,MFC的字符串类CString放到BCB上用.试下改回char *或者LPTSTR类型作为字符串作为返回值Top
2 楼rainfall19831109(恩恩)回复于 2006-06-04 18:24:48 得分 0
补充一下
因为VC编写的DLL的LIB文件格式是coff格式,而BCB使用的格式是omf,因此,如果该DLL是静态调用的话,还必须使用BCB安装目录下的bin目录的的coff2omf.exe,对coff格式的LIB文件转换一下
coff2omf.exe coff.lib omf.libTop
3 楼i_love_pc(杰子)(欢迎加入技术交流QQ群:23640432)回复于 2006-06-05 08:54:52 得分 0
顺便问一下,coff2omf.exe工具是不是可以转换vc写的静态连接库lib文件呢,我试过几次可是转换之后文件大小明显减小,而且调用时出错.请高手指点.Top
4 楼weixing979(★★★闪电侠★★★)回复于 2006-06-05 09:01:09 得分 0
不用CString ,用 char *Top




