c++-builder:转换为标准调用类型

c++-builder: convert into stdcall type

本文关键字:调用 类型 标准 转换 c++-builder      更新时间:2023-10-16

我目前正在尝试移植旧的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。