【问题标题】:c++-builder: convert into stdcall typec++-builder:转换成stdcall类型
【发布时间】:2013-04-18 13:55:49
【问题描述】:

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

问候, 朱利安

【问题讨论】:

    标签: c++ c++builder stdcall c++builder-xe2 owlnext


    【解决方案1】:

    铸造左值是无效的,并且 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。

    【讨论】:

    • 非常感谢!嗯,这个程序是95年左右设计的,所以可能有一些过时的东西......它也变得非常大,所以即使用过时的方法重写也值得认真思考^^你发给我的代码到目前为止运行良好!
    • 仅作记录:Remy Lebeau 将上述代码中的语法从函数类型更改为函数指针类型,这使得恕我直言更难阅读并隐藏了您实际使用指针的位置。我刚刚恢复了那个变化。从技术上讲,这两种变体都没有问题。
    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 2012-02-23
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2014-07-08
    相关资源
    最近更新 更多