[問題] 在C#使用C++物件遇到的問題

看板C_and_CPP (C/C++)作者 (阿東)時間1年前 (2023/11/27 16:29), 11月前編輯推噓5(502)
留言7則, 2人參與, 1年前最新討論串1/1
最近在開發將客戶提供的資源打包成供自家C#使用的DLL檔, 但執行到某個函式會出現錯誤,錯誤如下, "0x00007FFE66AE1CEC (UniversalUS.dll) 中 (於 Sample.exe) 擲回例外狀況: 0xC0000005: 讀取位置 0x0000000000000064 時發生存取違規。" 想問問是否我的寫法有誤.. 範例檔案如下, 客戶提供的資源以3rd.h和3rd.dll表示。 Test.h檔案內容如下, include "3rd.h" class __declspec(dllexport) Test { private: //define in 3rd.h 3rdTest* 3rdtest; public: Test(){ HINSTANCE hDll=LoadLibrary("3rd.dll"); typeof int(*CreateObj)(3rdTest** p3rdTest) CreateObj createObj=(CreateObj)GetProcAddress((HMODULE)hDll,"l pP createObj(&3rdtest); } ~Test() { 3retest.Release(); } int GetOtherObj(OtherObj** obj) { return 3rdtest->GetOtherObj(obj); } } ExternTest.h如下 #include "Test.h" extern "C" { extern __declspec(dllexport) Test* CreateTest(); extern __declspec(dllexport) void DisposeTest(Test* pTest); extern __declspec(dllexport) int GetOtherObj(Test* test); } Test.cpp如下 #include "ExternTest.h" extern "C" __declspec(dllexport) Test* CreateTest() { return new Test(); } extern "C" __declspec(dllexport) void DisposeTest(Test* pTest) { pTest->~Test(); } extern "C" __declspec(dllexport) OtherObj* GetOtnerObj(Test* pTest) { OtherObj* otherObj; pTest->GetOtherObj(&otherObj); return otherObj; } 在C#內使用狀況如下, ShTest.cs public class ShTest:IDisposable { #region dllimport [DllImport("Test.dll")] private static extern IntPtr CreateTest(); [DllImport("Test.dll")] private static extern void DisposeTest(IntPtr pTest); [DllImport("Test.dll")] private static extern IntPtr GetOtherObj(IntPtr pTest); #endregion #region ShapeFunction IntPtr pTest; public ShTest() { pTest=CreateTest(); } public void Dispose() { DisposeTest(pTest); } public ShOtherObj GetOtherObj() { IntPtr pOtherObj=GetOtherObj(pTest); return new ShOtherObj(pOtherObj); } #endregion } 執行到IntPtr pOtherObj=GetOtherObj(pTest);時會跳出存取違規的錯誤訊息,請問是否 我的寫法有錯誤呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 185.213.82.181 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1701073753.A.439.html ※ 編輯: Dong0129 (185.213.82.181 臺灣), 11/27/2023 16:30:56

11/27 17:22, 1年前 , 1F
GetOtnerObj 這有TYPO嗎?
11/27 17:22, 1F

11/27 17:24, 1年前 , 2F
3retest.Release(); 這有TYPO嗎?
11/27 17:24, 2F

11/27 17:27, 1年前 , 3F
return 3rdtest->GetOtherObj(obj); 這行要確認一下
11/27 17:27, 3F

11/27 17:28, 1年前 , 4F
3rdtest 可能沒有正確生成
11/27 17:28, 4F

11/27 17:28, 1年前 , 5F
3rdtest->GetOtherObj() 呼叫下去 就看不到了
11/27 17:28, 5F

11/27 21:53, 1年前 , 6F
GetProcAddr好像沒寫完整少括號
11/27 21:53, 6F

11/27 22:28, 1年前 , 7F
OtherObj* GetOtnerObj(Test* pTest)是不是打錯?
11/27 22:28, 7F
有少打的括號或錯字抱歉,對方回應了,要指定工作目錄才行,謝謝各位幫忙! ※ 編輯: Dong0129 (185.213.82.186 臺灣), 11/29/2023 11:10:19
文章代碼(AID): #1bP5DPGv (C_and_CPP)
文章代碼(AID): #1bP5DPGv (C_and_CPP)