내 원시 C++ 코드에서 호출하는 C# COM 개체를 작성했습니다. C# COM에는 몇 가지 기능과 이벤트가 있습니다.C# COM 문자열이 C++에서 손상되었습니다. BSTR
이벤트에 C++로 등록되었으며 C# 개체를 호출했습니다. 어떤 시점에서 이벤트가 호출되어 손상된 C++ BSTR에 C# 문자열을 매개 변수로 보냅니다.
나는 내가 생각할 수있는 모든 노력을, 그리고 모든을 통해 보았다 :-(사람이 BSTR이
편집 ??? 손상 왜 어떤 아이디어가 있습니까 : 중요 정보 :
-
을
- x64 비트에서 작동하지만 오류는 x86 버전에서만 발생합니다.
- C# COM은 모든 CPU로 컴파일됩니다. x86으로 컴파일하려고했지만 아무런 차이가 없습니다. ,
CS 코드 이벤트를 호출 :
// declaring the event and delegate
public delegate void on_start_delegate(string dict_param);
public event on_start_delegate on_start_click;
void on_start(mydictionary dictparams)
{
string strparams = dictparams.ToString();
Trace.WriteLine(strparams); // the string is fine
if (on_start_click != null)
on_start_click(strparams); // <--- Calling C++
}
연결 지점 클래스 : 이벤트에 등록하는 C++에서
[Guid("0581E......")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface Iregistration_form_events
{
[DispId(1)]
void on_start_click(string dict_param);
}
:
BEGIN_SINK_MAP(registraion_form)
SINK_ENTRY_INFO(SENSOR_REG_SINK_ID, __uuidof(namespace::Iregistration_form_events), 1, on_start_click, &on_start_click_info)
END_SINK_MAP()
_ATL_FUNC_INFO registraion_form::on_start_click_info = {CC_STDCALL, VT_EMPTY, 1, {VT_BSTR}};
기능이 BSTR이 손상됩니다.
void registration_form::on_start_click(BSTR params) // <-- params get corrupted!
{
dictionary dictparams;
std::wstringstream ss;
ss << params;
ss >> dictparams;
// do more stuff...
}
다시 말해서 귀하의 도움에 감사드립니다 !!!!
아이디어는 실제 코드 스 니펫 없이는 거의 발생하지 않습니다. BSTR은 아무런 이유없이 손상되지 않습니다. –
C# COM 개체 호출 방법을 알려주십시오. 또한 문자열이 손상되었다고 말하는 이유는 무엇입니까? 메모리에있는 문자열의 표현은 무엇입니까? – dna
@RomanR., 코드를 추가했습니다. 감사합니다. – TCS