首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++-builder:转换为stdcall类型

c++-builder:转换为stdcall类型
EN

Stack Overflow用户
提问于 2013-04-18 21:55:49
回答 1查看 517关注 0票数 0

我目前正在尝试移植一个旧的owl-c++-builder-projekt来使用XE2和owlnext。在旧文件中,我可以简单地调用一行

代码语言:javascript
复制
(FARPROC)LP_I2COpen = GetProcAddress(Hi_I2C, "I2COpen");

而LP_I2Open是用

代码语言:javascript
复制
#ifdef WIN32
#define CALLING_CONVENTION  __stdcall
#else
#define CALLING_CONVENTION  far pascal
#endif

int CALLING_CONVENTION (*LP_I2COpen)(HWND hndl,HINSTANCE hInstance, struct I2C_PROP far *ps);

#ifdef _WIN64
typedef INT_PTR (FAR WINAPI *FARPROC)();
#else
typedef int (FAR WINAPI *FARPROC)();
#endif

WINBASEAPI FARPROC WINAPI GetProcAddress(... 

这些代码块实际上来自多个文件。我认为这个顺序会很直观。

现在,我有一些困难,以重写这需要。我知道,现在左边被理解为一个转换方法,返回一个值,但不能被赋值给一个特定值,所以抛出了一个“L--error expected”。然而,我不太知道如何将FARPROC转换成适合LP_I2COpen的东西……尝试在不进行任何转换的情况下抛出此错误:

代码语言:javascript
复制
[BCC32 Fehler] Dio.cpp(2906): E2034 Konvertierung von 'int (__stdcall *)()' nach 'int (__stdcall *)(HWND__ *,HINSTANCE__ *,I2C_PROP *)' nicht möglich

那么,有没有人知道我对这一行做了哪些错误?

代码语言:javascript
复制
(FARPROC)LP_I2COpen = GetProcAddress(Hi_I2C, "I2COpen");

向你致敬,朱利安

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-18 22:10:38

强制转换l值是无效的,AFAIK它一直是无效的,尽管一些编译器接受了它。从技术上讲,您可以创建一个FARPROC类型的临时函数,然后在丢弃它之前将GetProcAddress()的结果赋值给它。正确的方法如下所示:

代码语言:javascript
复制
// function type alias
typedef int CALLINGCONVENTION I2COpenFn(HWND, HINSTANCE, I2C_PROP*);
// read and convert function pointer
I2COpenFn* LP_I2COpen = (I2COpenFn*)GetProcAddress(Hi_I2C, "I2COpen");

注意,像"far“这样的东西已经过时了。还要注意,这种C风格的强制转换很难看,但无论如何都没有任何类型安全性,而且它被隔离到有限的代码量中。如果可以,请使用适当的链接,而不是在运行时加载DLL。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16084946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档