请高手回答,关于BCB动态调用vc编写的DLL的函数类型转换问题

hunter200407 2006-06-04 02:47:26
本人用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;
void 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的值,希望高手指点,谢谢
...全文
426 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenjun716 2006-07-07
  • 打赏
  • 举报
回复
动态的:
//判断下DLLInst是否为空.
DLLInst = LoadLibrary("ComServer.dll");
//看一下VC中,导出函数的调用声明格式.__cdecl __stdcall __fastcall,
p = (open)GetProcAddress(DLLInst,"StartListen");

静态的:
就如楼上所说,问题还是在于VC,BC的Lib文件格式不一样.用BC自带工具转换一下.
jixingzhong 2006-07-07
  • 打赏
  • 举报
回复
如果是类型问题,
可以这么解决:

把 VC 的DLL 在vc 中再包装一层,
的到一个 调用 dll 的dll,
然后在 CB 中调用这个新的 dll ...

当然这个是在 类型没有办法直接转换的时候使用,
有一点麻烦,
不过也还好 ~
yunqi_1979 2006-06-04
  • 打赏
  • 举报
回复
你可以直接将VC编译好的DLL 和LIB 文件转换为CB的文件不就行了吗,具体使用CB安装目录下面的可执行转换文件 LIBIMP.EXE 好像是(反正有LIB),在dos下面,你就可以进行转换了,你只要输入命令,就会有帮助的, 你还要把相应的VC编译好的DLL 和LIB 拷贝到,你的执行目录,就好了。是这样把
hunter200407 2006-06-04
  • 打赏
  • 举报
回复
void result;改为 char result;打错了

如果我改为如下情况,返回的虽然是("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);
}
//---------------------------------------------------------------------------



希望帮忙把两个函数都给调通,谢谢了
hunter200407 2006-06-04
  • 打赏
  • 举报
回复
困扰两天了,不知道怎么办,如果有牛人帮忙修改重写,在此万分感谢,一定及时加分

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧