자격 증명 관리자에 계정을 등록해서 NTLM 이 필요한 사이트를 자동 로그인  시킬 수 있습니다.

 

단, 브라우저에서 해당영역의 사용자 인증이 "인트라넷 영역에서만 자동으로 로그온" 또는 "현재 사용자 이름 및 암호를 사용하여 자동으로 로그온" 으로 설정되어 있어야 합니다.

 

 

 

 

CredRead 함수는 자격증명 관리자에 해당 호스트가 있는지 확인합니다.

CredDelete 함수는 자격 증명 관리자에서 해당 호스트를 삭제합니다.

CredWrite 함수는 자격증명 관리자에 호스트를 등록합니다.

 

 

헤더 파일을 추가합니다.

#include <WinCred.h>

 

1) 계정 읽기 ( CredRead )

BOOL CUtility::ReadCredential()

{         

           BOOL bOk;

           WCHAR szServer[MAX_URL] = {0};

           WCHAR szDomain[MAX_NAME] = {0};

           WCHAR szId[MAX_NAME] = {0};

           WCHAR lpszPassword[MAX_NAME] = {0};

 

           LoadAccount(szServer,szDomain, szId, lpszPassword);

 

           WCHAR HostName[1000] = {0};  

           wcscpy(szHost, L"xxx.sharepoint.com");

           PCREDENTIAL pcred;      

          bOk = ::CredRead(szHost,  CRED_TYPE_DOMAIN_PASSWORD, 0,  &pcred);     

           if( bOk)  // 계정이 존재하면 TRUE을 리턴한다.

           {

                 ::CredFree(pcred);

           }           

           return bOk;

}

 

 

 

2) 계정 추가  (CredWrite)

BOOL CTipUtility::AddCredential2(CString& error)
    

 BOOL bOk;

 WCHAR szHost[MAX_URL] = {0};
 WCHAR szDomain[MAX_NAME] = {0};
 WCHAR szId[MAX_NAME] = {0};
 WCHAR lpszPassword[MAX_NAME] = {0};

 LoadAccount(szServer,szDomain, szId, lpszPassword);

 

 TCHAR   pzAccout[MAX_PATH] = {0};   

 

 CString account;
 account.AppendFormat(L"%s\\%s", szDomain, szId);  
 wcscpy(pzAccout, account);

 wcscpy(szHost, L"xxx.sharepoint.com");

 

 CREDENTIAL cred = {0};
 cred.Type = CRED_TYPE_DOMAIN_PASSWORD;
 cred.TargetName = HostName;
 cred.CredentialBlobSize = (DWORD)wcslen(lpszPassword) * sizeof(WCHAR);
 cred.CredentialBlob = (LPBYTE)lpszPassword;
 cred.Persist = CRED_PERSIST_ENTERPRISE;
 cred.UserName = pzAccout;
 bOk = ::CredWrite(&cred, 0);

 if(!bOk)  
 {
      DWORD result = ::GetLastError(); 
      WCHAR buf[256];
      FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, result,

    MAKELANGID  (LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 256, NULL);

error = buf;


 return bOk;

}

 

 

3) 계정 삭제 (CredDelete)

BOOL CTipUtility::DeleteCredential2(CString& error)
{
       BOOL bOk;

 WCHAR szServer[MAX_URL] = {0};
 WCHAR szDomain[MAX_NAME] = {0};
 WCHAR szId[MAX_NAME] = {0};
 WCHAR lpszPassword[MAX_NAME] = {0};

 LoadAccount(szServer,szDomain, szId, lpszPassword);

 

 TCHAR   HostName[1000] = {0};

 wcscpy(szHost, L"xxx.sharepoint.com");

 

 bOk = CredDelete(szHost, CRED_TYPE_DOMAIN_PASSWORD, 0);

 if(!bOk)  
 {


  DWORD result = ::GetLastError();
  WCHAR buf[256];
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, result, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 256, NULL);
  error = buf;


 }

 return bOk;


}

 

 

 

 

c++ 에서 HTTP 요청을  할 때 특수문자나 공백 등의 인코딩을 해서 요청해야 합니다.

그럴 때 InternetCanonicalizeUrl 함수를 사용합니다.

 

아래는 MFC로 함수화 한것입니다.

 

CString CUtility::InternetCanonicalizeUrl(CString origanlUrl)
{
     WCHAR wUrl[MAX_URL] = {0};
     DWORD dbuffer = MAX_URL;
     WCHAR szEncodeUrl[MAX_URL] = {0};
     wsprintf(szEncodeUrl, origanlUrl);

::InternetCanonicalizeUrl(szEncodeUrl, wUrl, &dbuffer,  ICU_DECODE );
CString sUrl(wUrl);
return sUrl;

}

설치된 아웃룩  버전 체크 방법입니다.

실행파일의 파일 버전을 통해서 체크합니다

 

#pragma comment(lib,"version.lib")

 

// 레지스트리 경로

#define REG_OUTLOOK_PATH L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\OUTLOOK.EXE"

 

// 아웃룩 경로 가져오기

CString CRegistry::GetOutlookPath()
{
 HKEY hKey;  
 BOOL bRet = TRUE;
 TCHAR pzValue[MAX_PATH] = {0};
 DWORD dwSize = sizeof(pzValue); 
 CString SubKey = REG_OUTLOOK_PATH;
 CString path = L"";

 DWORD nVal = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, SubKey, 0, KEY_READ, &hKey);
 if( nVal == ERROR_SUCCESS)
 {
  if (RegQueryValueEx(hKey, TEXT("Path"), 0 , NULL, (LPBYTE)&pzValue, &dwSize) == ERROR_SUCCESS)
  {
   path = pzValue;
  }
  ::RegCloseKey(hKey);  
 }
 else
 {  
  ::RegCloseKey(hKey);
 }

 return path;
}

 

// 아웃룩 버정 가져오기

WORD CUtility::GetOutlookVersion()
{
 CRegistry reg;
 CString outlook = reg.GetOutlookPath(); // 레지스트리에서 아웃룩 경로를 가져온다.
 WORD majorVer, minorVer, buildNum, revisionNum;
 majorVer = -1;

 if( outlook != L"")
 {
  CString path = outlook + L"OUTLOOK.EXE";

  DWORD infoSize = 0;
  

  // 파일로부터 버전정보데이터의 크기가 얼마인지를 구합니다.
  infoSize = GetFileVersionInfoSize(path, 0);
  if(infoSize==0) return -1;
 
  // 버퍼할당
  char* buffer = NULL;
  buffer = new char[infoSize];
  if(buffer)
  {
   // 버전정보데이터를 가져옵니다.
   if(GetFileVersionInfo(path,0,infoSize, buffer)!=0)
   {
    VS_FIXEDFILEINFO* pFineInfo = NULL;
                UINT bufLen = 0;
               // buffer로 부터 VS_FIXEDFILEINFO 정보를 가져옵니다.
               if(VerQueryValue(buffer, L"\\",(LPVOID*)&pFineInfo, &bufLen) !=0)
               {  
                    majorVer = HIWORD(pFineInfo->dwFileVersionMS);
                    minorVer = LOWORD(pFineInfo->dwFileVersionMS);
                    buildNum = HIWORD(pFineInfo->dwFileVersionLS);
                    revisionNum = LOWORD(pFineInfo->dwFileVersionLS);                   
                }
           }
   delete[] buffer;
   }
  return majorVer;  
 }
 else
 {
  return -1; // 미설치
 }
}

 

리턴되는 값에 따라서,

 

Office 97   -  7.0
Office 98   -  8.0
Office 2000 -  9.0
Office XP   - 10.0
Office 2003 - 11.0

Office 2007 - 12.0
Office 2010 - 14.0 (sic!)
Office 2013 - 15.0

 

 

cmd 창에서 수동으로 매번 regsvr32.exe  인증서 등록하는 것 짜증나죠

 

그래서, 빌드 후에 자동으로 인증서를 씌울 수 있는  편한 방법이 있습니다.

 

Microsoft isdk2 가 필요하다는 것을 아쉴테고 , 부가적으로 인증서를 넣어주는 프로그램을 http://www.stephan-brenner.com/?page_id=9 에서 다운로드 받아서 압축을 출고 isdk2 폴더에 넣습니다.

 

프로젝트의 Post-Build Event에서 다음과 같이 등록해서 빌드 후에 자동으로 서명받을 수 있도록 합니다.

 

 

 

signcode-pwd.exe -m 인증서 패스워드
SignCode -spc D:\00.Working\01.Project\07.Register\ISDK2\인증서.spc -v D:\00.Working\01.Project\07.Register\ISDK2\인증서.pvk -n "프로그램명" -i
http://www.xxx.co.kr -t http://timestamp.Verisign.com/scripts/timstamp.dll $(TargetDir)\$(ProjectName).dll
setreg -q 1 TRUE
signcode-pwd.exe -t

MFC 정적 DLL 만들기

[Native] C/C++/ATL/[MFC] Dev Tips 2014.12.30 17:54 Posted by Sudean(수딘)

MFC용 정정 DLL 만드는 방법입니다.

표준 DLL 보다 헐씬 간단하고 개발도 쉽죠. 단, MFC 에만 가능하다는 것....

 

VS 2010 에서 

  1) Add - New Project 선택합니다.  

 

2) 해당 프로젝트에 클래스를 추가하고 헤더파일에 CObject를 상속받고 클래스 AFX_EXT_CLASS 키워드를 추가합니다.

 

 

3) 생성된 DLL 및 LIB 파일과 클래스 파일을 빌드 후에  dll을 참조할 프로그램에서 사용할 수 있도록 자동 복사하도록 합니다.

 

 

 4) 메인 프로그램에 사용할 수 있도록 설정합니다.

    

    Linker - Input 의 Additional Dependencies에 lib 명 추가

   

 

    Linker - General - Additional  Library Directories 에 해당 dll과 lib 경로 설정

 

메인 프로그램에서 헤더 파일을  추가하고 사용하면 됩니다.

 

간단하죠~~

 

 

 

 

  

 

 

 


숫자를 문자로 문자를 숫자로 변환....?!?!
늘 쓰는 것이지만 막상 쓸려고 하면 기억이 나지 않죠(Copy&Paste의 부작용인듯^..^)
그래서 늘 검색질이죠..ㅋㅋ

그냥 제가 필요할때 볼려고 올려봅니다.

1) Converts an integer to a string

int nstyle = 100;
TCHAR szStyle[10] = {0};
_itot_s(nstyle , szStyle, 10);    -> nstyle 의 숫자값을 szStyle에 TCHAR 타입으로 변환.
※ UNICODE로 정의했으면 TCHAR은 wchar 타입이고 아니면 char 타입임.

2) Converts a string  to an integer
  _bstr_t width = "200";
    int nWidth  = _ttoi(width); 

초간단....
요즘은 멀티바이트보다 바로 유니코드로 주로 개발해서 TCHAR은 잘 쓰지 않지만.. 그래도 구애받지 않고 개발할땐 유용하죠....

 

 

 

파일명을 랜덤하게 생성한기 위해서 작성했던 코드입니다. 
Random 함수는 제한적이고, 중복될 여지도 있는 것 같고....

유일한 키를 생성할 때는 Guid 만한게 없죠.....

[샘플 코드]

// GUID을 생성해서
void CUtil::MakeGUID(_bstr_t* guid)
{

 WCHAR TestGUIDString[40] = {0,}; 
 _GUID TestGUID;

 // CoCreateGuid 생성하기
 CoCreateGuid(&TestGUID); 
 
// 생성한 GUID를 829C1584-C57B-4dac-BCE7-6F33455F747A 와 같은 포멧으로 변환.
 wsprintf(TestGUIDString, L"%.8X-%.4X-%.4X-%.2X%.2X-%.2X%.2X%.2X%.2X%.2X%.2X",
   TestGUID.Data1,    TestGUID.Data2,    TestGUID.Data3,  TestGUID.Data4[0],
   TestGUID.Data4[1], TestGUID.Data4[2], TestGUID.Data4[3], TestGUID.Data4[4],
   TestGUID.Data4[5], TestGUID.Data4[6], TestGUID.Data4[7]
 );

 *guid = TestGUIDString;

}


요즘이야 웹 페이지를 아예  UTF-8로 저장하기 때문에 다국어를 고민할 필요가 없지만, 예전에는 중국어 등 특정문자를 표현할려고 하면 &#xxxxx; 요런 형태로 HTML에 표시을 했다.

요  십진수 유니코드 문자값을 실제 유니코드 문자로 변환하는 방법이다.(초 간단....저 한참 찾았다는....ㅋㅋ)

&# 뒤에 나오는 5자리 숫자가 코드 값이므로......

wchar_t wzUnicode[2] = {0}; 
wchar_t wzUnicode[0] = _wtoi(xxxxx); //&#을 제외한 5자리 문자를 integer로 변환하기만 하면됨....

// 다른 곳에서 적당히 사용.....
wstring wsUnicode = wzUnicode;
_bstr_t bstrUnicode = wzUnicode;








간혹(자주) VS 2005로 Connection Point로 구현된 인터페이스에 Add Method 컨텍스트 메뉴가 아예 뜨지 않을 때가 있다.
아래처럼.. 대략 난감...

그럴 경우 수동으로 이벤트를 추가하는 방법이다.




아래처럼 인터페이스 라이브러리를 펼쳐서 메쏘드를 추가한다.


위저드를 통해서 메쏘드를 등록합니다.


여기까지는 IDL 파일에만 등록된 상태이고 Connection Point의 Proxy 클래스에 위저드가 자동으로  이벤트 메쏘드를 생성된 상태는 아닙니다.
ConnectionPoint을 구현하기 위해서 연결지점추가을 추가해서 이벤트를 추가합니다.




이렇게 해서 Fire_xxx 자동으로 생성되었으면 땡큐일텐데.... ConnectionPoint Proxy 클래스가 또 만들어지는 경우가 있습니다. 이런 젠장........



이럴때는, 새로 생성된 ConnectionPoint 클래스에서  방금 만든 메쏘드의 Fire_xxx 해당 함수를 복사해서,
이전 ConnectionPoint  파일을 열어서 붙여넣습니다.

프로젝트를 종료하고 새로 생성된 CP 파일을 삭제합니다.
마지막으로, 위저드가 생성한 코드(메인클래스의 헤더파일)를 제거합니다.



빌드 한 후에 테스트를 합니다.
웹 페이지에서 자바스크립트로 이벤트가 잘 받는지  확인~~~ (샘플 자바스크립트는 패스~~~ ㅋㅋㅋ)





Visual C++ 문자열 타입....드렇게 많다.... 왜 이렇게 많은지..
물론, 계속 Native한 문자열 처리를 좀 더 편하게 처리하고자 Object, 템플릿 등으로 많이 나와서 그렇지만, 때에 따라서는 정말 char* 로 변환할 수 밖에 없는 상황이 늘 존재한다..  이럴때가  정말  싫다..싫어~~~!!!, 왜냐하면 모든  타입의 특성을 아는게 아니라서 그때 마다 구글질을 해야 하니....늘 짜증난다... (C#의 String  처럼 하나로 통일 해달란 말이다.~~~~ ㅋㅋ, 남북 통일도 아니고 이런것도 못하나...??)

[문자열변환 샘플 코드]
 

#include <iostream>
#include <stdlib.h>
#include <string>

#include "atlbase.h"
#include "atlstr.h"
#include "comutil.h"

using namespace std;
using namespace System;

int main()
{
    char *orig = "Hello, World!";
    cout << orig << " (char *)" << endl;

    // Convert to a wchar_t*
    size_t origsize = strlen(orig) + 1;
    const size_t newsize = 100;
    size_t convertedChars = 0;
    wchar_t wcstring[newsize];
    mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);
    wcscat_s(wcstring, L" (wchar_t *)");
    wcout << wcstring << endl;

    // Convert to a _bstr_t
    _bstr_t bstrt(orig);
    bstrt += " (_bstr_t)";
    cout << bstrt << endl;

    // Convert to a CComBSTR
    CComBSTR ccombstr(orig);
    if (ccombstr.Append(L" (CComBSTR)") == S_OK)
    {
        CW2A printstr(ccombstr);
        cout << printstr << endl;
    }

    // Convert to a CString
    CString cstring(orig);
    cstring += " (CString)";
    cout << cstring << endl;

    // Convert to a basic_string
    string basicstring(orig);
    basicstring += " (basic_string)";
    cout << basicstring << endl;

    // Convert to a System::String
    String ^systemstring = gcnew String(orig);
    systemstring += " (System::String)";
    Console::WriteLine("{0}", systemstring);
    delete systemstring;
}

Output

Hello, World! (char *)
Hello, World! (wchar_t *)
Hello, World! (_bstr_t)
Hello, World! (CComBSTR)
Hello, World! (CString)
Hello, World! (basic_string)
Hello, World! (System::String)

Converting from wchar_t *

Example

This example demonstrates how to convert from a wchar_t * to the other string types listed above.

Copy

// convert_from_wchar_t.cpp
// compile with: /clr /link comsuppw.lib

#include <iostream>
#include <stdlib.h>
#include <string>

#include "atlbase.h"
#include "atlstr.h"
#include "comutil.h"

using namespace std;
using namespace System;

int main()
{
    wchar_t *orig = L"Hello, World!";
    wcout << orig << L" (wchar_t *)" << endl;

    // Convert to a char*
    size_t origsize = wcslen(orig) + 1;
    const size_t newsize = 100;
    size_t convertedChars = 0;
    char nstring[newsize];
    wcstombs_s(&convertedChars, nstring, origsize, orig, _TRUNCATE);
    strcat_s(nstring, " (char *)");
    cout << nstring << endl;

    // Convert to a _bstr_t
    _bstr_t bstrt(orig);
    bstrt += " (_bstr_t)";
    cout << bstrt << endl;

    // Convert to a CComBSTR
    CComBSTR ccombstr(orig);
    if (ccombstr.Append(L" (CComBSTR)") == S_OK)
    {
        CW2A printstr(ccombstr);
        cout << printstr << endl;
    }

    // Convert to a CString
    CString cstring(orig);
    cstring += " (CString)";
    cout << cstring << endl;

    // Convert to a basic_string
    wstring basicstring(orig);
    basicstring += L" (basic_string)";
    wcout << basicstring << endl;

    // Convert to a System::String
    String ^systemstring = gcnew String(orig);
    systemstring += " (System::String)";
    Console::WriteLine("{0}", systemstring);
    delete systemstring;
}

Output

Hello, World! (wchar_t *)
Hello, World! (char *)
Hello, World! (_bstr_t)
Hello, World! (CComBSTR)
Hello, World! (CString)
Hello, World! (basic_string)
Hello, World! (System::String)

Converting from _bstr_t

Example

This example demonstrates how to convert from a _bstr_t to the other string types listed above.

Copy

// convert_from_bstr_t.cpp
// compile with: /clr /link comsuppw.lib

#include <iostream>
#include <stdlib.h>
#include <string>

#include "atlbase.h"
#include "atlstr.h"
#include "comutil.h"

using namespace std;
using namespace System;

int main()
{
    _bstr_t orig("Hello, World!");
    wcout << orig << " (_bstr_t)" << endl;

    // Convert to a char*
    const size_t newsize = 100;
    char nstring[newsize];
    strcpy_s(nstring, (char *)orig);
    strcat_s(nstring, " (char *)");
    cout << nstring << endl;

    // Convert to a wchar_t*
    wchar_t wcstring[newsize];
    wcscpy_s(wcstring, (wchar_t *)orig);
    wcscat_s(wcstring, L" (wchar_t *)");
    wcout << wcstring << endl;

    // Convert to a CComBSTR
    CComBSTR ccombstr((char *)orig);
    if (ccombstr.Append(L" (CComBSTR)") == S_OK)
    {
        CW2A printstr(ccombstr);
        cout << printstr << endl;
    }

    // Convert to a CString
    CString cstring((char *)orig);
    cstring += " (CString)";
    cout << cstring << endl;

    // Convert to a basic_string
    string basicstring((char *)orig);
    basicstring += " (basic_string)";
    cout << basicstring << endl;

    // Convert to a System::String
    String ^systemstring = gcnew String((char *)orig);
    systemstring += " (System::String)";
    Console::WriteLine("{0}", systemstring);
    delete systemstring;
}

Output

Hello, World! (_bstr_t)
Hello, World! (char *)
Hello, World! (wchar_t *)
Hello, World! (CComBSTR)
Hello, World! (CString)
Hello, World! (basic_string)
Hello, World! (System::String)

Converting from CComBSTR

Example

This example demonstrates how to convert from a CComBSTR to the other string types listed above.

Copy

// convert_from_ccombstr.cpp
// compile with: /clr /link comsuppw.lib

#include <iostream>
#include <stdlib.h>
#include <string>

#include "atlbase.h"
#include "atlstr.h"
#include "comutil.h"
#include "vcclr.h"

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

int main()
{
    CComBSTR orig("Hello, World!");
    CW2A printstr(orig);
    cout << printstr << " (CComBSTR)" << endl;

    // Convert to a char*
    const size_t newsize = 100;
    char nstring[newsize];
    CW2A tmpstr1(orig);
    strcpy_s(nstring, tmpstr1);
    strcat_s(nstring, " (char *)");
    cout << nstring << endl;

    // Convert to a wchar_t*
    wchar_t wcstring[newsize];
    wcscpy_s(wcstring, orig);
    wcscat_s(wcstring, L" (wchar_t *)");
    wcout << wcstring << endl;

    // Convert to a _bstr_t
    _bstr_t bstrt(orig);
    bstrt += " (_bstr_t)";
    cout << bstrt << endl;

    // Convert to a CString
    CString cstring(orig);
    cstring += " (CString)";
    cout << cstring << endl;

    // Convert to a basic_string
    wstring basicstring(orig);
    basicstring += L" (basic_string)";
    wcout << basicstring << endl;

    // Convert to a System::String
    String ^systemstring = gcnew String(orig);
    systemstring += " (System::String)";
    Console::WriteLine("{0}", systemstring);
    delete systemstring;
}

Output

Hello, World! (CComBSTR)
Hello, World! (char *)
Hello, World! (wchar_t *)
Hello, World! (_bstr_t)
Hello, World! (CString)
Hello, World! (basic_string)
Hello, World! (System::String)

Converting from CString

Example

This example demonstrates how to convert from a CString to the other string types listed above.

Copy

// convert_from_cstring.cpp
// compile with: /clr /link comsuppw.lib

#include <iostream>
#include <stdlib.h>
#include <string>

#include "atlbase.h"
#include "atlstr.h"
#include "comutil.h"

using namespace std;
using namespace System;

int main()
{
    CString orig("Hello, World!");
    wcout << orig << " (CString)" << endl;

    // Convert to a char*
    const size_t newsize = 100;
    char nstring[newsize];
    strcpy_s(nstring, orig);
    strcat_s(nstring, " (char *)");
    cout << nstring << endl;

    // Convert to a wchar_t*
    // You must first convert to a char * for this to work.
    size_t origsize = strlen(orig) + 1;
    size_t convertedChars = 0;
    wchar_t wcstring[newsize];
    mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);
    wcscat_s(wcstring, L" (wchar_t *)");
    wcout << wcstring << endl;

    // Convert to a _bstr_t
    _bstr_t bstrt(orig);
    bstrt += " (_bstr_t)";
    cout << bstrt << endl;

    // Convert to a CComBSTR
    CComBSTR ccombstr(orig);
    if (ccombstr.Append(L" (CComBSTR)") == S_OK)
    {
        CW2A printstr(ccombstr);
        cout << printstr << endl;
    }

    // Convert to a basic_string
    string basicstring(orig);
    basicstring += " (basic_string)";
    cout << basicstring << endl;

    // Convert to a System::String
    String ^systemstring = gcnew String(orig);
    systemstring += " (System::String)";
    Console::WriteLine("{0}", systemstring);
    delete systemstring;
}

Output

Hello, World! (CString)
Hello, World! (char *)
Hello, World! (wchar_t *)
Hello, World! (_bstr_t)
Hello, World! (CComBSTR)
Hello, World! (basic_string)
Hello, World! (System::String)

Converting from basic_string

Example

This example demonstrates how to convert from a basic_string to the other string types listed above.

Copy

// convert_from_basic_string.cpp
// compile with: /clr /link comsuppw.lib

#include <iostream>
#include <stdlib.h>
#include <string>

#include "atlbase.h"
#include "atlstr.h"
#include "comutil.h"

using namespace std;
using namespace System;

int main()
{
    string orig("Hello, World!");
    cout << orig << " (basic_string)" << endl;

    // Convert to a char*
    const size_t newsize = 100;
    char nstring[newsize];
    strcpy_s(nstring, orig.c_str());
    strcat_s(nstring, " (char *)");
    cout << nstring << endl;

    // Convert to a wchar_t*
    // You must first convert to a char * for this to work.
    size_t origsize = strlen(orig.c_str()) + 1;
    size_t convertedChars = 0;
    wchar_t wcstring[newsize];
    mbstowcs_s(&convertedChars, wcstring, origsize, orig.c_str(), _TRUNCATE);
    wcscat_s(wcstring, L" (wchar_t *)");
    wcout << wcstring << endl;

    // Convert to a _bstr_t
    _bstr_t bstrt(orig.c_str());
    bstrt += " (_bstr_t)";
    cout << bstrt << endl;

    // Convert to a CComBSTR
    CComBSTR ccombstr(orig.c_str());
    if (ccombstr.Append(L" (CComBSTR)") == S_OK)
    {
        CW2A printstr(ccombstr);
        cout << printstr << endl;
    }

    // Convert to a CString
    CString cstring(orig.c_str());
    cstring += " (CString)";
    cout << cstring << endl;

    // Convert to a System::String
    String ^systemstring = gcnew String(orig.c_str());
    systemstring += " (System::String)";
    Console::WriteLine("{0}", systemstring);
    delete systemstring;
}

Output

Hello, World! (basic_string)
Hello, World! (char *)
Hello, World! (wchar_t *)
Hello, World! (_bstr_t)
Hello, World! (CComBSTR)
Hello, World! (CString)
Hello, World! (System::String)

Converting from System::String

Example

This example demonstrates how to convert from a System.String to the other string types listed above.

Copy

// convert_from_system_string.cpp
// compile with: /clr /link comsuppw.lib

#include <iostream>
#include <stdlib.h>
#include <string>

#include "atlbase.h"
#include "atlstr.h"
#include "comutil.h"
#include "vcclr.h"

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

int main()
{
    String ^orig = gcnew String("Hello, World!");
    Console::WriteLine("{0} (System::String)", orig);

    pin_ptr<const wchar_t> wch = PtrToStringChars(orig);

    // Convert to a char*
    size_t origsize = wcslen(wch) + 1;
    const size_t newsize = 100;
    size_t convertedChars = 0;
    char nstring[newsize];
    wcstombs_s(&convertedChars, nstring, origsize, wch, _TRUNCATE);
    strcat_s(nstring, " (char *)");
    cout << nstring << endl;

    // Convert to a wchar_t*
    wchar_t wcstring[newsize];
    wcscpy_s(wcstring, wch);
    wcscat_s(wcstring, L" (wchar_t *)");
    wcout << wcstring << endl;

    // Convert to a _bstr_t
    _bstr_t bstrt(wch);
    bstrt += " (_bstr_t)";
    cout << bstrt << endl;

    // Convert to a CComBSTR
    CComBSTR ccombstr(wch);
    if (ccombstr.Append(L" (CComBSTR)") == S_OK)
    {
        CW2A printstr(ccombstr);
        cout << printstr << endl;
    }

    // Convert to a CString
    CString cstring(wch);
    cstring += " (CString)";
    cout << cstring << endl;

    // Convert to a basic_string
    wstring basicstring(wch);
    basicstring += L" (basic_string)";
    wcout << basicstring << endl;

    delete orig;
}