看板 C_and_CPP 關於我們 聯絡資訊
最近在開發將客戶提供的資源打包成供自家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
NDark: GetOtnerObj 這有TYPO嗎?11/27 17:22
NDark: 3retest.Release(); 這有TYPO嗎?11/27 17:24
NDark: return 3rdtest->GetOtherObj(obj); 這行要確認一下11/27 17:27
NDark: 3rdtest 可能沒有正確生成11/27 17:28
NDark: 3rdtest->GetOtherObj() 呼叫下去 就看不到了11/27 17:28
wulouise: GetProcAddr好像沒寫完整少括號11/27 21:53
wulouise: OtherObj* GetOtnerObj(Test* pTest)是不是打錯?11/27 22:28
有少打的括號或錯字抱歉,對方回應了,要指定工作目錄才行,謝謝各位幫忙! ※ 編輯: Dong0129 (185.213.82.186 臺灣), 11/29/2023 11:10:19