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

作者: Dong0129 (阿東跟上面講的情況一樣b)   2023-11-27 16:29:11
最近在開發將客戶提供的資源打包成供自家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);時會跳出存取違規的錯誤訊息,請問是否
我的寫法有錯誤呢?
作者: NDark (溺於黑暗)   2023-11-27 17:22:00
GetOtnerObj 這有TYPO嗎?3retest.Release(); 這有TYPO嗎?return 3rdtest->GetOtherObj(obj); 這行要確認一下3rdtest 可能沒有正確生成3rdtest->GetOtherObj() 呼叫下去 就看不到了
作者: wulouise (在線上!=在電腦前)   2023-11-27 21:53:00
GetProcAddr好像沒寫完整少括號OtherObj* GetOtnerObj(Test* pTest)是不是打錯?

Links booklink

Contact Us: admin [ a t ] ucptt.com