Work | Posted by 흑목 2006/03/31 12:35

Variant Conversion

MS communication control을 이용하려다 여기저기 찾아보고 해결한 것입니다.

char * 형에서 중간에 NULL 문자까지 포함시킬 수 있습니다.


참고되시기 바랍니다.


먼저 VARAIANT -> char *


       unsigned char input_buf[512] = {0};


       VARIANT var;

       ::VariantInit(&var);

       var = m_cCommReceive.GetInput();    // -> 데이타를 var 형태로 받았습니다.


       unsigned char HUGEP *pbstr;

       HRESULT hr;


       hr = SafeArrayAccessData(var.parray, (void HUGEP* FAR*)&pbstr);

       unsigned long cE = var.parray->rgsabound[0].cElements;


       memcpy( input_buf, pbstr, nCount );    // -> var 형을 char *로 멤카피

       input_buf[nCount] = 0;


       hr = SafeArrayUnaccessData(var.parray);


       SendData(input_buf, nCount);    // ->char * 형을 처리하기 위해 사용자마음대로의 함수로 보냄.



다음으로 char * -> VARIANT 인데, 다음의 소스를 참고 했습니다.

http://excel96.cafe24.com/moin.cgi/UsingVariant


   /*http://excel96.cafe24.com/moin.cgi/UsingVariant 에서 수정*/

   unsigned char* pMyOriginalArray = data;


   HRESULT hr;

  

   SAFEARRAYBOUND rgsabound[1];

   rgsabound[0].lLbound = 0;      

   rgsabound[0].cElements = nLength;   // -> nLength 는 char *형으로 넘겨받은 문자열의 길이


   SAFEARRAY FAR* pMySafeArray;

   pMySafeArray = SafeArrayCreate(VT_UI1, 1, rgsabound);     // -> VT_UI1 형이 char형을 받습니다.

  

   char* pData;

   hr = SafeArrayAccessData(  pMySafeArray, (void**)&pData);

   memcpy(pData, pMyOriginalArray, nLength);

   SafeArrayUnaccessData(pMySafeArray);

  

   VARIANT myVariant;

   myVariant.parray = pMySafeArray;

   myVariant.vt = VT_ARRAY|VT_UI1;

  

   ////////////////////////////////////

   SendOutput(myVariant);    // -> var 형을 사용자마음대로 함수로 보냄

   ////////////////////////////////////

  

   hr = SafeArrayDestroy(pMySafeArray);


'Work' 카테고리의 다른 글

Visual Studio의 fflush 이야기  (1) 2007/11/20
TimeAttack  (0) 2007/03/29
Buffering Error  (0) 2006/05/18
Builder Listview Column Sorting  (0) 2006/03/31
Variant Conversion  (0) 2006/03/31
"extern C"에 대하여  (0) 2006/03/30