C#从非托管win32 dll运行对话框

C#从非托管win32 dll运行对话框,c#,c++,winapi,dll,C#,C++,Winapi,Dll,我制作了一个win32 DLL,它使用对话框进行录制和播放。我试图在我的C#代码中使用它,通过一个函数传入一个指针,这样我就可以保留数据,并实际使用另一个函数打开对话框,调用CreateDialog并将我的DLGPROC提供给它。我希望dll尽可能独立地运行,只保留对数据的引用并告诉它何时打开和关闭 标题h: #pragma once #pragma comment(lib, "winmm.lib") #include <Windows.h> #ifdef __cplusplus

我制作了一个win32 DLL,它使用对话框进行录制和播放。我试图在我的C#代码中使用它,通过一个函数传入一个指针,这样我就可以保留数据,并实际使用另一个函数打开对话框,调用CreateDialog并将我的DLGPROC提供给它。我希望dll尽可能独立地运行,只保留对数据的引用并告诉它何时打开和关闭

标题h:

#pragma once
#pragma comment(lib, "winmm.lib")

#include <Windows.h>

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT BOOLEAN StartDiag();
EXPORT BOOLEAN SetData(DOUBLE*);
我非常确信StartDiag被正确调用,因为它总是返回false,这意味着函数体被输入,if语句被正确计算。明显的问题是,这意味着DLL没有像我希望的那样创建对话框。对话框显然是在一个rc文件中,应该包含在dll中,那么这是如何工作的呢?如何让DLL实际运行对话资源

if (CreateDialog(NULL, ...)
您不能在此处传递NULL并希望成功。这只适用于简单的单模块程序,这种程序只有一个包含所有内容的EXE文件。在您的场景中,Windows将在托管程序集中搜索资源。那是一头失败的鲸鱼。它必须是包含对话框资源的模块的句柄。当然是DLL

您需要DllMain()而不是WinMain()。储存你得到的把手,以便以后使用。样板:

HMODULE ThisDllHandle;

BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID)
{
    if (reason == DLL_PROCESS_ATTACH) {
        ThisDllHandle = hModule;
        DisableThreadLibraryCalls(hModule);
    }
    return TRUE;
}
注意:“不要从链接到静态C运行时库(CRT)的DLL调用此函数。静态CRT需要DLL_THREAD_ATTACH和DLL_THREAD_DETATCH通知才能正常运行。”
if (CreateDialog(NULL, ...)
HMODULE ThisDllHandle;

BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID)
{
    if (reason == DLL_PROCESS_ATTACH) {
        ThisDllHandle = hModule;
        DisableThreadLibraryCalls(hModule);
    }
    return TRUE;
}