gpt4 book ai didi

C++-生成器 : convert into stdcall type

转载 作者:行者123 更新时间:2023-11-28 03:18:37 26 4
gpt4 key购买 nike

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

问候,朱利安

最佳答案

转换左值是无效的,据我所知,它一直是无效的,尽管一些编译器接受了它。从技术上讲,您创建了一个 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。

关于C++-生成器 : convert into stdcall type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com