作者Dong0129 (阿東)
看板C_and_CPP
標題[問題] 在C#使用C++物件遇到的問題
時間Mon Nov 27 16:29:11 2023
最近在開發將客戶提供的資源打包成供自家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