簡體   English   中英

來自非托管 win32 dll 的 C# 運行對話框

[英]C# run dialog from unmanaged win32 dll

我制作了一個使用對話框進行記錄和播放的 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*);

記錄.c:

#include <windows.h>
#include "resource.h"
#include "Header.h"

#define INP_BUFFER_SIZE 16384

BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

TCHAR szAppName[] = TEXT("Record1");
double* pData;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
{
    return 0;
}

BOOLEAN StartDiag()
{
    if (CreateDialog(NULL, MAKEINTRESOURCE(DLG_RECORD), NULL, DlgProc) == 
        NULL)
    {
        return FALSE;
    }
    return TRUE;
}

BOOLEAN SetData(double* p)
{
    p = pData;
    return TRUE;
}

BOOL CALLBACK DlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   ...
}

C#:

    [DllImport("RecordLib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
    public static extern Boolean SetData(ref double[] d);
    [DllImport("RecordLib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
    public static extern Boolean StartDiag();

我非常有信心 StartDiag 被正確調用,因為它總是返回 false,這意味着輸入了函數體並且正確評估了 if 語句。 明顯的問題是這意味着 DLL 沒有像我想要的那樣創建對話框。 Dialog 顯然在一個 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM