(연관된 글이 1개 있습니다.)
안녕하세요. 항상 도움 받고 있습니다. 미리 감사드리며 질문 드리겠습니다.
현재 C#으로 DLL을 만들어서 C++에서 호출하여 사용하고 있습니다.
배열을 전달하는 함수는 두 가지인데 C++에서 C#으로 전달하는 것은 잘 됩니다.
문제는 역으로 C++에서 배열을 전달 받고 싶은데, C#에서 OUT 키워드를 사용하여 전달 받으려고 했으나 아래와 같이 예외가 발생합니다.
==> 처리되지 않은 예외 발생(0x00007FFADB1A4FD9, PROJECTNAME.exe): Microsoft C++ 예외: _com_error, 메모리 위치 0x000000BB27EFF250.
전달 받으려는 배열을 RETURN으로 받아보려는 시도도 해보았습니다. (참조:
https://www.sysnet.pe.kr/2/0/12491)
이 시도 또한 같은 예외를 발생시킵니다.
////////////먼저 C++ 코드입니다.
UINT32 getFoo(UINT32 pChannel, UINT32 pIndexNO)
{
SAFEARRAY* _presult = 0;
SAFEARRAYBOUND Bound;
Bound.lLbound = 0;
Bound.cElements = 8 * 32;
_presult = SafeArrayCreateVector(VT_UI8, 0, 8 * 32);
unsigned long retStatus;
///////////실제 C# 라이브러리 함수 호출 부분//////////////
_presult = mp_device->GetTrgOutFieldPacket(pChannel, pIndexNO, &retStatus);
if (retStatus == 0x00)
{
std::cout << "Succeeded to GetTrgOutFieldPacket!\n";
}
else
{
std::cout << "Failed to GetTrgOutFieldPacket!\n";
}
//SafeArrayUnaccessData(_result);
//SafeArrayDestroy(*_ppresult);
SafeArrayDestroy(_presult);
return retStatus;
}
//////////////아래는 C# DLL로 전달 : 잘됨///////////////////
UINT32 setFoo(UINT32 pChannel, UINT32 pIndexNO)
{
CComSafeArray<UINT32> _result(8 * 32);
for (int i = 0; i < _result.GetCount(); i++)
{
_result[i] = (UINT32)(i - 100);
}
UINT32 retStatus = mp_device->SetTrgOutFieldPacket(pChannel, pIndexNO, _result);
if (retStatus == 0x00)
{
std::cout << "Succeeded to SetTrgOutFieldPacket!\n";
}
else
{
std::cout << "Failed to SetTrgOutFieldPacket!\n";
}
_result.Destroy();
return retStatus;
}
//////////////////C# 인터페이스 부분입니다.
UInt32[] getFoo(uint pChannel, uint pIndexNO, out uint status);
uint setFoo(uint pChannel, uint pIndexNO, uint[] writeData);
C# 프로젝트에서 디버깅할때는 해당 배열에 값이 제대로 할당되어 있습니다.
/////////////////생성된 TLI 파일입니다. 여기서 예외가 발생됩니다.
inline SAFEARRAY * Idevice::getFoo( unsigned long pChannel, unsigned long pIndexNO, unsigned long * status ) {
SAFEARRAY * _result = 0;
_com_dispatch_method(this, 0x5, DISPATCH_METHOD, VT_ARRAY|VT_I4, (void*)&_result,
L"\x0003\x0003\x4003", pChannel, pIndexNO, status);
return _result;
}
inline unsigned long Idevice::setFoo( unsigned long pChannel, unsigned long pIndexNO, SAFEARRAY * writeData ) {
unsigned long _result = 0;
_com_dispatch_method(this, 0x6002000a, DISPATCH_METHOD, VT_I4, (void*)&_result,
L"\x0003\x0003\x2003", pChannel, pIndexNO, writeData);
return _result;
}
질문 전달이 잘 되도록 잘 썼는지 모르겠습니다. 답변 부탁드립니다. 감사합니다.
[연관 글]
[최초 등록일: ]
[최종 수정일: 9/22/2022]