2013-06-13 2 views
0

내 원시 C++ 코드에서 호출하는 C# COM 개체를 작성했습니다. C# COM에는 몇 가지 기능과 이벤트가 있습니다.C# COM 문자열이 C++에서 손상되었습니다. BSTR

이벤트에 C++로 등록되었으며 C# 개체를 호출했습니다. 어떤 시점에서 이벤트가 호출되어 손상된 C++ BSTR에 C# 문자열을 매개 변수로 보냅니다.

나는 내가 생각할 수있는 모든 노력을, 그리고 모든을 통해 보았다 :-(

사람이 BSTR이

편집 ??? 손상 왜 어떤 아이디어가 있습니까 : 중요 정보 :

  1. x64 비트에서 작동하지만 오류는 x86 버전에서만 발생합니다.
  2. C# COM은 모든 CPU로 컴파일됩니다. x86으로 컴파일하려고했지만 아무런 차이가 없습니다.
  3. ,

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... 
} 

다시 말해서 귀하의 도움에 감사드립니다 !!!!

+0

아이디어는 실제 코드 스 니펫 없이는 거의 발생하지 않습니다. BSTR은 아무런 이유없이 손상되지 않습니다. –

+0

C# COM 개체 호출 방법을 알려주십시오. 또한 문자열이 손상되었다고 말하는 이유는 무엇입니까? 메모리에있는 문자열의 표현은 무엇입니까? – dna

+0

@RomanR., 코드를 추가했습니다. 감사합니다. – TCS

답변

2

"It works on x64"는 호출 규칙이 일치하지 않는다는 강력한 힌트입니다. x64는 하나의 호출 규칙 만 있지만 x86에는 몇 가지 호출 규칙이 있습니다.

이벤트 처리기가 stdcall로 선언되었는지 확인하십시오.

+0

그냥 STDCALL이어야합니다. 거기에 검사가없고 컴파일러는 잘못된 함수 참조를 전달합니다. –

+0

너 말이 맞아 !! :-) 나는 그것을 놓쳤다. ... 나는 x64에 하나의 호출 규칙이있다는 것을 알지 못했다 ...! :-) – TCS

관련 문제