如何为一个dll设置入口点

10

起初我认为dlls的入口点是DLLMain,但当我尝试在C#中导入它时,我收到了一个错误,指出找不到入口点。这是我的代码:

#include <Windows.h>

int Test(int x,int y)
{
    return x+y;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(0,L"Test",L"From unmanaged dll",0);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
} 

我该如何为我的dll设置入口点?如果可以的话,您能否简要解释一下入口点是什么?

比如说,我是否必须再次导入相同的dll并更改入口点,以便我可以在同一个dll中使用其他函数?谢谢。

1个回答

13
在你的例子中,看起来你打算将Test()作为一个入口点,但你没有导出它。即使你开始导出它,它也可能无法与C++名称“修饰”(名称重整)正常工作。我建议重新定义你的函数为:

在您的示例中,似乎您打算将Test()作为一个入口点,但是您没有将其导出。即使您开始导出它,由于C ++名称“修饰”(mangling),它可能无法正常工作。我建议将您的函数重新定义为:

extern "C" __declspec(dllexport) int Test(int x,int y)
extern "C"组件将移除C++名称修饰。 __declspec(dllexport)组件会导出符号。
详见http://zone.ni.com/devzone/cda/tut/p/id/3056
编辑:您可以通过此方式添加任意数量的入口点。调用代码只需要知道要检索的符号名称(如果您正在创建静态 .lib,则会为您处理)。

1
在 C 声明中使用 __stdcall,或在 C# 声明中使用 CallingConvention.Cdecl。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接