【问题标题】:C: compiling C++ code in CC:在 C 中编译 C++ 代码
【发布时间】:2013-09-20 17:07:17
【问题描述】:

我正在尝试在 C 项目中导出一些 C++ 代码... 实际上我遇到了以下问题:

_CreateToolhelp32Snapshot fnCreateToolhelp32Snapshot = (_CreateToolhelp32Snapshot) GetProcAddress(GetModuleHandleA(L"kernel32"), "CreateToolhelp32Snapshot");
_Thread32First fnThread32First = (_Thread32First)  GetProcAddress(GetModuleHandleW(L"kernel32"), "Thread32First");
_Thread32Next fnThread32Next = (_Thread32Next) GetProcAddress(GetModuleHandleW(L"kernel32"), "Thread32Next");

我在 C 编程中的三个对象中保存了三个函数(“CreateToolhelp32Snapshot”、“Thread32First”和“Thread32First”)的内存地址...我在 Ubuntu 13.04 下使用 mingw 进行编译,我得到了这个错误:

(row 1): error: initializer element is not constant
(row 2): error: initializer element is not constant
(row 3): error: initializer element is not constant

我知道在 C 中地址函数不被视为常量值,但会非常有助于找到解决此约束的方法...

提前感谢您的任何建议...

【问题讨论】:

  • GetProcAddress(GetModuleHandleW(L"kernel32"), "Thread32First"); 和其他是 Win32 API 函数,我认为你在 Ubuntu 中编译它不会有任何运气。
  • 请展示一些真实的代码,actualunedited 错误,并指出这些错误在代码中的位置。请编辑您的问题,不要将其作为评论发布。
  • 我在这里没有看到任何特定于 c++ 的内容。
  • 您必须使用全局变量。在其他地方使用它之前,使用初始化函数来设置这些值。在标准 c 中,您不能在进入 main 之前执行代码(如调用 GetProcAddress 函数)。
  • @JoachimPileborg & Nemanja:MinGW 为 Linux 主机/Windows 目标提供交叉编译器。在 Linux 上编程并使用该交叉编译器来构建 Windows 二进制文件是很常见的。

标签: c++ c memory-address mingw32 initializer


【解决方案1】:

您必须使用全局变量。在其他地方使用它之前,使用初始化函数来设置这些值。在标准 c 中,您不能在进入 main 之前执行代码(如调用 GetProcAddress 函数)。

_CreateToolhelp32Snapshot fnCreateToolhelp32Snapshot;
_Thread32First fnThread32First;
_Thread32Next fnThread32Next;

void initialize()
{
    fnCreateToolhelp32Snapshot = (_CreateToolhelp32Snapshot) GetProcAddress(GetModuleHandleA(L"kernel32"), "CreateToolhelp32Snapshot");
    fnThread32First = (_Thread32First)  GetProcAddress(GetModuleHandleW(L"kernel32"), "Thread32First");
    fnThread32Next = (_Thread32Next) GetProcAddress(GetModuleHandleW(L"kernel32"), "Thread32Next");
}

int main()
{
    initialize();
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多