c++-builder:转换为标准调用类型
c++-builder: convert into stdcall type
我目前正在尝试移植旧的owl-c++-builder- project来使用XE2和owlnext。在旧文件中,我可以简单地调用
行(FARPROC)LP_I2COpen = GetProcAddress(Hi_I2C, "I2COpen");
而LP_I2Open是用
定义的#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值预期"错误被抛出。然而,我不太知道如何将FARPROC转换成适合LP_I2COpen的东西……尝试不进行任何转换将抛出此错误:
[BCC32 Fehler] Dio.cpp(2906): E2034 Konvertierung von 'int (__stdcall *)()' nach 'int (__stdcall *)(HWND__ *,HINSTANCE__ *,I2C_PROP *)' nicht möglich
那么,有谁知道我这行写错了吗?
(FARPROC)LP_I2COpen = GetProcAddress(Hi_I2C, "I2COpen");
问候,朱利安
强制转换l值是无效的,而且我知道它一直是无效的,尽管一些编译器接受它。从技术上讲,您创建一个FARPROC类型的临时对象,然后在丢弃之前将其分配给GetProcAddress()的结果。正确的方法如下:
// 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。
相关文章:
- 构造函数正在调用一个使用当前类类型的函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 调用外部函数,无法指定类型 C++/MVS
- 如何在另一个类中调用类型类的向量?
- 调用类型的标记构造函数(如果可用),否则为默认值
- C++ 数组和指针调用类型
- 调用类型 'const RadioMap::comp' 的对象没有匹配函数
- 如何调用类型为预定义结构的函数
- 作为模板参数的可调用类型上的C++约束
- 模板类的构造函数在使用 new 关键字时调用类型构造函数
- 在运行时之前调用类型未知的模板化函数
- 在VS2010中获取可调用类型的返回类型
- 在什么情况下会调用类型的转换运算符?
- c++-builder:转换为标准调用类型
- 没有调用类型转换操作符
- C++编译时谓词,用于测试是否可以使用 T 类型的参数调用 F 类型的可调用对象
- 没有匹配函数来调用类型 'hash<char">' 的对象(Stroustrup Book Drill)