簡體   English   中英

如何在托管代碼中使用c ++ dll中的其他dll創建方法?

[英]How do you make a method avaible to other dlls in a c++ dll in managed code?

第一段代碼是我正在處理的示例,在將其更改為第二個示例之后,它對__declspec(dllexport)執行,它給出__declspec(dllexport)不能應用於具有__clrcall調用約定的函數。 刪除那段代碼會使dll編譯,但該方法對目標dll是不可用的。 此外,當我使用PE資源管理器查看DLL時,沒有導出方法。 是否存在__declspec(dllexport)的托管變體?

extern "C" __declspec(dllexport) int UserInstruction (HWND hWnd,
                              HINSTANCE hInst,
                              double FAR *Function, 
                              char FAR *Str1,
                              char FAR *Str2)
{
       strcpy(Str1, "TEST FUNCTION");
       return (TRUE);
}


extern "C" __declspec(dllexport) int UserInstruction (IntPtr hWnd, IntPtr hInst, double *Function, char *Str1, char *Str2)
{
    Str1 = "TEST FUNCTION";
    return (true);
}

C ++ / CLI編譯器支持導出托管函數。 它會自動生成一個thunk,在必要時加載並初始化CLR,以便可以執行托管代碼。 小心開銷。 但是,您不能將任何托管類型用於函數參數。 在你的情況下IntPtr。 這沒有意義,調用您的函數的非托管代碼將不使用托管類型。

你必須自己組織他們。 這里不是問題,這些是指針,所以你可以簡單地轉換為IntPtr:

extern "C" __declspec(dllexport) 
int __stdcall UserInstruction (HWND hWnd, HINSTANCE hInst, double FAR *Function, char FAR *Str1, char FAR *Str2)
{
    IntPtr windowPtr = (IntPtr)hWnd;
    IntPtr instancePtr = (IntPtr)hInst;
    // etc..
}

明確選擇調用約定總是一個好主意。 因為這個原因,我添加了__stdcall,這是導出的DLL函數最常見的一個。

暫無
暫無

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

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