【问题标题】:__stdcall without any decoration__stdcall 没有任何装饰
【发布时间】:2012-03-26 10:34:13
【问题描述】:

我有一个.dll,我怀疑它使用了__stdcall 函数,但完全 没有修饰名称(甚至没有下划线或@ 符号)。我为它写了一个.def 文件,别名为

func1 = func1
func1@4 = func1

但我认为lib(我用来从.def 文件创建导入库)忽略了别名(链接器仍然说func1@4 未定义)

如何创建将func1@4 映射到func1 的导入库?

【问题讨论】:

  • 您的导出文件中的语法看起来不正确。检查 dumpbin.exe 以确定。通常每行只需要包含您希望函数具有的名称(例如func1),链接器会自行找出详细信息。

标签: windows dll calling-convention build-tools stdcall


【解决方案1】:

我不知道是否可以用lib.exe 创建正确的.lib 文件,所以我建议创建一个带有原始DLL 导出的函数存根的DLL。

示例dll.cpp 文件:

void __stdcall foo(int) {}

dll.def文件:

EXPORTS
foo=foo

然后你从 IDE 或命令行编译它:

cl dll.cpp /link /dll /def:dll.def /noentry

它将创建正确的dll.lib 文件,因此您可以将其与如下代码一起使用:

void __stdcall foo(int);
#pragma comment(lib, "dll")
int main()
{
    foo(42);
}

【讨论】:

    【解决方案2】:

    您应该将函数原型声明为 extern "C",因为您(显然)在 C++ 模式下编译:

    extern "C" void func1(void); // correct prototype, add __stdcall if necessary?
    

    你可以将头文件的整个部分包裹在里面

    extern "C" {
        // ... C compatible declarations
    }
    

    【讨论】:

    • 我正在使用extern "c"。它自己将其更改为__cdecl。当我添加 __stdcall 时,我添加了 @
    • @baruch 也许您可以向我们展示代码。 FWIW,我不认为问题出在 def 文件中
    • @baruch 那么...试试其他代码?引用“链接器说 func1@4 未定义”,即问题出在您的代码中。您指的是func1@4 而不是func1,所以您的标头---错误---与库不匹配
    • 这是个问题?我如何告诉它 func1 应该链接为 func1 但仍使用 __stdcall 约定?
    • @baruch 好吧,如果导出的是名称func1,那会让我相信它不是实际上是__stdcall。我会在几分钟后删除我无用的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多