2009-08-21 7 views
1

dans le code ci-dessous je suis le c: \ windows \ Microsoft.Net \ Framework \ v2.0.057 au tampon.Maintenant, je wnat pour stocker la valeur ci-dessus dans doble quotes "c: \ windows \ Microsoft.Net \ Framework \ v2.0.057" et je veux passer cela pour le processus. comment faire ce chemin entre guillemets ....Comment stocker la valeur wchar dans la chaîne de guillemets double

HINSTANCE hDLL = LoadLibrary(TEXT("mscoree.dll")); 
    FNPTR_GET_COR_SYS_DIR GetCORSystemDirectory = NULL; 
GetCORSystemDirectory = (FNPTR_GET_COR_SYS_DIR) GetProcAddress (hDLL,"GetCORSystemDirectory"); 
if(GetCORSystemDirectory!=NULL) 
      {  
      WCHAR buffer[MAX_PATH + 1]; 
      DWORD length; 
      HRESULT hr = GetCORSystemDirectory(buffer,MAX_PATH,&length); 
      std::string tbuf="\"buffer\""; 
      // std::string tbuf=" \""+(string)buffer+"\\InMageSQL.dll\" /codebase /tlb /silent"; 

      if(S_OK==hr) 
      { 
       wcscat(buffer,L"RegAsm.exe"); 
       STARTUPINFO si; 
       PROCESS_INFORMATION pi; 
       ZeroMemory(&si, sizeof(si)); 
       si.cb = sizeof(si); 
       ZeroMemory(&pi, sizeof(pi)); //(LPSTR)getcurrentpath.c_str() 
       if(!CreateProcess((LPCTSTR)buffer,(LPTSTR)strInMageSqlDll.c_str(),NULL, NULL,FALSE, 0,NULL,NULL,&si,&pi)) 
       { 
        cout<<"CreateProcess failed "<<GetLastError()<<endl; 
       } 

Répondre

-1

Essayez les méthodes suivantes

std::wstring tbuf="\""; 
tbuf+= buffer; 
tbuf+= "\""; 
+0

Vous ne pouvez ajouter des chaînes wchar_t à basic_string

+0

@ Steve, bonne prise. Switched to wstring – JaredPar

+0

@JaredPar: Mais vous ne pouvez pas non plus affecter un 'const char []' à un 'std :: wstring'. – sbi

-1

méthode de JaredPar fonctionne, voici une autre:

std::wostringstream oss 
oss << '"' << buffer << '"'; 
std::wstring strBuff(oss.str()); 

modifier:

commuté à la version w * s.

+0

Cela ne fonctionne pas non plus. http://codepad.org/xdSH1Taj –

+0

Fait la même erreur. Utiliser wostringstream et wstring devrait fonctionner correctement. – luke

+0

@luke: Il a cependant l'inconvénient de construire et de détruire un train de chaînes pour une opération qui pourrait facilement (et probablement moins cher) être faite en utilisant uniquement des chaînes. – sbi

1

Je vais sortir d'ici, car je n'ai pas beaucoup utilisé l'API Windows ces dernières années et je n'ai jamais utilisé WCHAR.

Pour un, vous pouvez élargir le tampon un peu et percez les citations à droite dans le:

WCHAR buffer[MAX_PATH + 1 + 2]; 
buffer[0] = L'"'; 
buffer[sizeof(buffer)/sizeof(WCHAR)-1] = L'"'; 
DWORD length; 
HRESULT hr = GetCORSystemDirectory(buffer,MAX_PATH+1,&length); 

Cependant, cela semble inélégant au mieux. (Et je devrais réfléchir à deux fois si j'ai obtenu ce droit sizeof(buffer)/sizeof(WCHAR)-1 - que je suis trop paresseux pour.)

Une autre façon serait d'utiliser le modèle std::basic_string<>. Notez que std::string est un typedef pour std::basic_string<char>. Il y a peu, vous empêche de l'instanciation pour d'autres types de caractères aussi:

WCHAR buffer[MAX_PATH + 1]; 
DWORD length; 
HRESULT hr = GetCORSystemDirectory(buffer,MAX_PATH,&length); 
std::basic_string<WCHAR> tbuf= L"\"" + buffer + L"\""; 
// use 'tbuf.c_str()' to read 'tbuf' as a C-string (there's no safe way to write to it) 

Notez que cela suppose que WCHAR se développe pour wchar_t. Si cela est, vous auriez pas le cas (je ne l'ai jamais travaillé avec lui, donc je ne sais pas) de jeter les littéraux:

std::basic_string<WCHAR> tbuf = static_cast<WCHAR>(L'"') 
           + buffer 
           + static_cast<WCHAR>(L'"'); 
Questions connexes