RSS feed
<< 에버런 사용기 | Home | Virtual Server R2 x64 를 Vista (x64) Ultimate K 에 설치하기 >>

std::basic_string을 VARIANT의 bstrVal 타입에 대입하기와 반대로 VARIANT의 bstr

std::basic_string을 VARIANT의 bstrVal 타입에 대입하기와 반대로 VARIANT의 bstrVal을 std::basic_string을 넣기 예제 -- 작성자 goodidea.blogsite.org: 고진혁


보통 IDispatch 를 통해 외부에 interface로 호출할때 VARIANT로 값을 넘기고 받게 되는데 이때 문자열처리예제이다.

아래는 IE에서 띄운 ActiveX 에서 javascript 함수쪽에 이벤트를 발생해서 다시 javascript 함수결과를 받아서 처리하는경우이다.

void foo::sample( int messageType, std::basic_string *message){

VARIANT vtT[1]; // 리턴용
VARIANT rgargs[2]; // 파라메터용

rgargs[1].vt =VT_INT;
rgargs[1].intVal=messageType;

rgargs[0].vt =VT_BSTR;
// 이부분은 std::basic_string 을 bstrVal 로 대입할때
rgargs[0].bstrVal=SysAllocString( _bstr_t(message->c_str()));

(*message)="기본메시지";

if (m_dispEvents)
{
if (SUCCEEDED(DsoDispatchInvoke(m_dispEvents, NULL, SOME_EVENT_ID, 0, 2, rgargs, &vtT[0])))
{
char buf[2048];

// 핵심은 이부분이다. 이벤트 결과로 받은 bstrVal을 std::basic_string으로 넣는경우이다.
wcstombs(buf,vtT[0].bstrVal,2048);

(*message)=buf;

// 받은곳에서 클리어 ActiveX 에서 브라우져쪽에 javascript를 호출해서 javascript 함수내에서 문자열을 되돌린경우 이에대한 메모리 해제책임은 넘겨받은 쪽에있다.
VariantClear(&vtT[0]);


}else{

(*message) = "invoke error";
}

}


** 하여간 c나 c++ 은 타입처리가 정말이지... 뭣 같다... java가 좋아..
Tags :



Add a comment Send a TrackBack