0

我目前正在尝试移植旧的 owl-c++-builder-projekt 以使用 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-Value expected”错误。但是,我不太清楚如何将 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");

问候,朱利安

4

1 回答 1

2

强制转换 l 值是无效的,并且 AFAIK 它一直是无效的,尽管一些编译器接受了它。从技术上讲,您创建了一个 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");

请注意,“远”之类的东西已经过时了。另请注意,这种 C 风格的转换很丑陋,但无论如何您都没有任何类型安全性,并且它被隔离到有限数量的代码中。如果可以,请使用正确的链接而不是在运行时加载 DLL。

于 2013-04-18T14:10:37.700 回答