c++调用dll中的函数,参数为指针型结构体

zqxzwxzy 2011-06-11 12:34:33
大家好,刚开始写c++程序,现在要调用dll文件OOIDRV32.DLL中的一个函数:
short OOI_FullScan(FULLPARAM* fp);
FULLPARAM
是一个结构体,
struct FULLPARAM
{
short cmd;
short fdc;
WORD dsf;
short boxcar;
short average;
short scan_dark;
short correct_dark;
short extrig;
short chan_ena;
float* chdat[8];
} ;
请问该怎么写调用的语句?
其中也是调用这个dll中的一个无参函数,这样写的,调用成功了,上边那个形参是指针型结构体,就不知怎么弄了;

typedef int(__stdcall *rint_)();
rint_ type;
HINSTANCE DllInst = LoadLibrary( "OOIDRV32.DLL");
type=GetProcAddress(DllInst, "OOI_GetSpectrometerType");
...全文
566 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryfdizuo 2011-06-11
  • 打赏
  • 举报
回复
dizuo@126.com,发过来看一下,顺便加上dll啊。请速度~
zqxzwxzy 2011-06-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 dizuo 的回复:]
什么意思?看一下你的程序是可以的,但是改那个dll不太可行。
[/Quote]
呵呵,当然是改我的程序,不可能那么麻烦去改提供的dll
HINSTANCE DllInst = LoadLibrary( "OOIDRV32.DLL");
struct OOI_FAM_PARAM
{
short cmd[4];
short fdc[4];
WORD dsf[4];
short boxcar[4];
short average[4];
short chan_ena[4];
short scan_dark[4];
short correct_dark[4];
short extrig[4];
short upper4chan;
short error[4];
float data[4][2048];
} ;


typedef short (__stdcall *PL)(OOI_FAM_PARAM*fp);
PL p_function;
p_function =GetProcAddress(DllInst, "OOI_Flexible_Acquisition");那个错误显示是在这条

OOI_FAM_PARAM p;
结构体赋值这里略去;

p_function(&p);

ryfdizuo 2011-06-11
  • 打赏
  • 举报
回复
什么意思?看一下你的程序是可以的,但是改那个dll不太可行。
zqxzwxzy 2011-06-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dizuo 的回复:]
引用 10 楼 zqxzwxzy 的回复:

引用 9 楼 namelij 的回复:
楼主,貌似必须要头文件吧

或者你用depends看看你dll里面的函数

你好,这个函数说明我有,在用户手册里有,知道函数形参、返回值就行了吧,调用这个dll中的一个无参函数,这样写的,调用成功了
typedef int(__stdcall *rint_)();
rint_ type;
HI……
[/Quote]
是不匹配,手册中函数描述,short OOI_Fullscan(FULLPARM*fp),结构体FULLPARM的成员也列出来了,
typedef short (__stdcall *PL)(FULLPARAM*fp);这句改来改去还是错误。这样的调用写c++的应该很常用吧,能不能帮改改?
ryfdizuo 2011-06-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zqxzwxzy 的回复:]

引用 9 楼 namelij 的回复:
楼主,貌似必须要头文件吧

或者你用depends看看你dll里面的函数

你好,这个函数说明我有,在用户手册里有,知道函数形参、返回值就行了吧,调用这个dll中的一个无参函数,这样写的,调用成功了
typedef int(__stdcall *rint_)();
rint_ type;
HINSTANCE DllInst……
[/Quote]
按照手册上说的做,明显就是函数指针类型不匹配。
zqxzwxzy 2011-06-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dizuo 的回复:]
你哪里定义过'int (__stdcall *)(void)'这种类型的函数指针的?
这句错误指向哪句话?
[/Quote]
HINSTANCE DllInst = LoadLibrary( "OOIDRV32.DLL");
struct OOI_FAM_PARAM
{
short cmd[4];
short fdc[4];
WORD dsf[4];
short boxcar[4];
short average[4];
short chan_ena[4];
short scan_dark[4];
short correct_dark[4];
short extrig[4];
short upper4chan;
short error[4];
float data[4][2048];
} ;


typedef short (__stdcall *PL)(OOI_FAM_PARAM*fp);
PL p_function;
p_function =GetProcAddress(DllInst, "OOI_Flexible_Acquisition");那个错误显示是在这条
ryfdizuo 2011-06-11
  • 打赏
  • 举报
回复
你哪里定义过'int (__stdcall *)(void)'这种类型的函数指针的?
这句错误指向哪句话?
zqxzwxzy 2011-06-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 namelij 的回复:]
楼主,貌似必须要头文件吧

或者你用depends看看你dll里面的函数
[/Quote]
你好,这个函数说明我有,在用户手册里有,知道函数形参、返回值就行了吧,调用这个dll中的一个无参函数,这样写的,调用成功了
typedef int(__stdcall *rint_)();
rint_ type;
HINSTANCE DllInst = LoadLibrary( "OOIDRV32.DLL");
type=GetProcAddress(DllInst, "OOI_GetSpectrometerType");
调用 type();
  • 打赏
  • 举报
回复
楼主,貌似必须要头文件吧

或者你用depends看看你dll里面的函数
zqxzwxzy 2011-06-11
  • 打赏
  • 举报
回复
你好,这个是函数介绍,short OOI_Fullscan(FULLPARM*fp),FULLPARM结构体成员也列出来了,只有dll文件,没有头文件,所以只好这样调用,不知道问题在哪里?
显示cannot convert from 'int (__stdcall *)(void)' to 'short (__stdcall *)(struct CFcjDlg::OnButton1::FULLPARAM *)';不知道为什么它显示要从'int (__stdcall *)(void)' 转变过去?


ryfdizuo 2011-06-11
  • 打赏
  • 举报
回复
typedef short (*PLUGIN_FUNC_PTR)(FULLPARAM*);
//定义变量
FULLPARAM var;
// 注册插件
PLUGIN_FUNC_PTR p_function =
(PLUGIN_FUNC_PTR) ::GetProcAddress (h_mod, "OOI_GetSpectrometerType");

if (p_function != NULL)
{
(*p_register_function)( &var ); //调用函数
}
sduxiaoxiang 2011-06-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zqxzwxzy 的回复:]
将typedef short (*PL)(FULLPARAM*fp);
改成typedef short (__stdcall *PL)(FULLPARAM*fp);仍显示cannot convert from 'int (__stdcall *)(void)' to 'short (__stdcall *)(struct CFcjDlg::OnButton1::FULLPARAM *)'
[/Quote]
OOI_FullScan方法对么??
就想叫yoko 2011-06-11
  • 打赏
  • 举报
回复
typedef short(__stdcall *pFun)(FULLPARAM *fp);

其实一样的
多了个参数而已
你看看函数指针的相关知识吧
zqxzwxzy 2011-06-11
  • 打赏
  • 举报
回复
将typedef short (*PL)(FULLPARAM*fp);
改成typedef short (__stdcall *PL)(FULLPARAM*fp);仍显示cannot convert from 'int (__stdcall *)(void)' to 'short (__stdcall *)(struct CFcjDlg::OnButton1::FULLPARAM *)'
zqxzwxzy 2011-06-11
  • 打赏
  • 举报
回复
上面执行错误的代码是这样的
struct FULLPARAM
{
short cmd;
short fdc;
WORD dsf;
short boxcar;
short average;
short scan_dark;
short correct_dark;
short extrig;
short chan_ena;
float* chdat[8];
} ;
HINSTANCE h_mod = LoadLibrary( "OOIDRV32.DLL");

typedef short (*PL)(FULLPARAM*fp);

PL p_function;

p_function =GetProcAddress(h_mod, "OOI_FullScan");
if (p_function != NULL)
{
p_function(&p); //调用函数
}
zqxzwxzy 2011-06-11
  • 打赏
  • 举报
回复
这个调用方法我昨天试了,显示错误:cannot convert from 'int (__stdcall *)(void)' to 'short (__cdecl *)(struct CFcjDlg::OnButton1::FULLPARAM *)'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast,是类型不对吧,怎么弄呢?
sduxiaoxiang 2011-06-11
  • 打赏
  • 举报
回复

void main(void)
{
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;
PMax Max
HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL,"Max");
A=Max(5,8);
Printf("比较的结果为%d\n",a);
FreeLibrary(hDLL);//卸载MyDll.dll文件;
}


cankao

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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