BCB 动态调用VC dll,dll头文件函数的用法

by0717 2010-10-19 03:59:34
请大家帮忙看一下,我静态调用已经成功,dll 头文件的函数可以用。
但是动态调用的时候,loadLibrary(dll)已经成功,但是dll 头文件的函数怎么用?
下面是代码:
dll 头文件函数代码:

#ifdef LB_API2_EXPORTS
#define LB_API2 __declspec(dllexport) long __stdcall
#else
#define LB_API2 __declspec(dllimport) long __stdcall
#endif
......//省略

LB_API2 LB_AddressConflictExists(void);//函数定义
LB_API2 LB_BlinkLED_Addr(long addr);
LB_API2 LB_BlinkLED_Idx(long idx);
LB_API2 LB_BlinkLED_SN(char* SN);

我要在我写的程式里用上面的函数,怎么办?
GetProcAddress在这里怎么用?
我在my.cpp的my.h
// my.h
class TForm1 : public TForm
{
...
private: // User declarations
void (__stdcall *LB_AddressConflictExists)();
...
}
然后在my.cpp
LoadLibrary(dll);//成功
LB_AddressConflictExists = (void (__stdcall*)()) GetProcAddress(DLLInst, "LB_AddressConflictExists");
这里提示没有左值;
请问是不是这样用啊?


...全文
105 1 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
by0717 2010-10-20
ok 了
谢谢
结贴给分
回复
by0717 2010-10-20
我在看看是不是写错东西了
回复
by0717 2010-10-20
呵呵
还是不行
long (WINAPI *pLB_AddressConflictExists)(void);
提示错误为:
[C++ Error] Unit1.cpp(13): E2356 Type mismatch in redeclaration of '__stdcall LB_AddressConflictExists()'
回复
zzbinfo 2010-10-20
没有看到你的这个#define LB_API2 __declspec(dllimport) long __stdcall
#endif定义,我以为 LB_API2这个是你的函数类型呢,你把我上面代码中的LB_API2改成long试试看
回复
zzbinfo 2010-10-20
我的错误,不好意思没有看见你上面的文件定义,稍等我给改改
回复
by0717 2010-10-20
Dear zzbinfo:
在用你的方法时候,先声明
LB_API2 (WINAPI *pLB_AddressConflictExists)(void);
提示错误为:
[C++ Error] Unit1.cpp(13): E2356 Type mismatch in redeclaration of '__stdcall LB_AddressConflictExists()'
然后 LB_API2头文件
LB_API2 LB_AddressConflictExists(void);//函数定义
提示错误为:
[C++ Error] LB_API2.h(254): E2344 Earlier declaration of '__stdcall LB_AddressConflictExists()'
然后
pLB_AddressConflictExists = (LB_API2 (WINAPI *)(void))GetProcAddress(hInsts,"LB_AddressConflictExists");
提示错误为:
[C++ Error] Unit1.cpp(25): E2188 Expression syntax
回复
by0717 2010-10-19
谢谢楼上。
我想请教一下,这里的
1 LB_API2 LB_AddressConflictExists(void);//
中LB_API2是什么呢?函数类型吗?(初学,有点白)
2 pLB_AddressConflictExists = (LB_API2 (WINAPI *)(void))GetProcAddress(hInsts,"LB_AddressConflictExists
这句定义的LB_API2 (WINAPI *)(void))为Void,这void的函数,是怎么知道的,要是函数有两个返回值,怎判读LB_API2 (WINAPI *)的类型?
回复
zzbinfo 2010-10-19
在my。cpp前面这样先定义函数后面再调用,之前要注意定义LB_API2
LB_API2   (WINAPI *pLB_AddressConflictExists)(void);
LB_API2 (WINAPI *pLB_BlinkLED_Addr)(long);
LB_API2 (WINAPI *pLB_BlinkLED_Idx)(long);
LB_API2 (WINAPI *pLB_BlinkLED_SN)(char* );


pLB_AddressConflictExists = (LB_API2 (WINAPI *)(void))GetProcAddress(hInsts,"LB_AddressConflictExists");
pLB_BlinkLED_Addr = (LB_API2 (WINAPI *)(long))GetProcAddress(hInsts,"LB_BlinkLED_Addr");
pLB_BlinkLED_Idx = (LB_API2 (WINAPI *)(long))GetProcAddress(hInsts,"LB_BlinkLED_Idx");
pLB_BlinkLED_SN = (LB_API2 (WINAPI *)(char*))GetProcAddress(hInsts,"LB_BlinkLED_SN");
回复
相关推荐
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2010-10-19 03:59
社区公告
暂无公告