【问题标题】:DLL function not exported: Unable to find an entry point named TestFuncDLL 函数未导出:找不到名为 TestFunc 的入口点
【发布时间】:2009-04-27 11:39:58
【问题描述】:

我正忙于了解一点点 C/C++,以及与 C# 的互操作。我检查了几个创建简单 Win32 DLL 并从 C# 使用它的示例,但是当我尝试调用我的 DLL 时,我收到运行时错误:“无法找到名为 TestFunc 的入口点”。我的 DLL 看起来像这样,我从一个 Win32 DLL 项目创建它,并使用空项目选项:

标题:

__declspec(dllexport) int TestFunc(char *, char *, char *);

代码文件:

#include "stdafx.h"
#include "TestLib.h"

__declspec(dllexport) int TestFunc(char *arg1, char *arg2, char *arg3) 
{
  char str1[] = "Brady Kelly";
  char str2[] = "Hello World";
  char str3[] = "1234567890";

  strcpy(arg1, str1);

  return 128;   
}

我做错了什么?

【问题讨论】:

  • 我认为“1800 INFORMATION”解决了这个问题,但你是如何在 C# 项目中声明函数的?
  • @Ahmed,我这样声明:[DllImport("TestLib.dll")] public static extern int TestFunc(StringBuilder arg1, StringBuilder arg2, StringBuilder arg3);

标签: c windows winapi


【解决方案1】:

您的函数是使用 C 或 C++ 绑定编译的吗?您没有指定,但在我看来,您可能正在使用 C++ 编译器 - 编译器使用与 C 编译器非常不同的名称修饰,您将无法简单地找到名称“TestFunc”就像您使用 C 编译器或使用 C 名称修改规则一样。

要简单地告诉 C++ 编译器使用 C 名称修改规则,请在头文件中使用:

extern "C"
{
  __declspec(dllexport) int TestFunc(char *, char *, char *);
}

【讨论】:

  • 只是给你看,我什至不知道名字修改。谢谢!
【解决方案2】:

此外,您只需要函数声明(在头文件中)前面的 declspec,而不需要定义。用于检查从 DLL 导出的内容以及 DLL 所依赖的内容的有用工具是Dependency Walker

【讨论】:

    【解决方案3】:

    实际上,既然您已将此问题标记为 C,我建议对 1800 INFORMATION 的解决方案稍作改动:

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #ifdef EXPORT_MODE
    #define METHODTYPE __declspec(dllexport)
    #else 
    #define METHODTYPE __declspec(dllimport)
    #endif
    
    #ifdef __cplusplus
    }
    #endif
    
    /*! _The_ method */
    METHODTYPE int TestFunc(char *, char *, char *);
    

    这将允许您在客户代码和您的代码中使用相同的标头。

    注意: Dependency Walker 不再与 VS2008 捆绑在一起。如果您使用的是VS2008,则必须下载它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      相关资源
      最近更新 更多