在下面的代码中,我将 c:\windows\Microsoft.Net\Framework\v2.0.057 放入缓冲区。现在我想将上述值存储在双引号中 "c:\windows\Microsoft .Net\Framework\v2.0.057",我想将其传递给流程。如何在双引号中创建此路径....
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;
}
我在这里有点冒险,因为我最近几年没有使用太多 Windows API,而且我从未使用过 WCHAR
.
首先,您可以稍微扩大缓冲区并将引号插入其中:
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);
然而,这充其量似乎不够优雅。 (而且我需要三思而后行,我是否得到了 sizeof(buffer)/sizeof(WCHAR)-1
是对的——我太懒了。)
另一种方法是使用 std::basic_string<>
模板。注意 std::string
是 typedef
对于 std::basic_string<char>
.您也可以为其他字符类型实例化它:
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)
请注意,这假定 WCHAR
扩展为 wchar_t
.如果不是这种情况(我从来没有使用过它,所以我不知道),你必须转换文字:
std::basic_string<WCHAR> tbuf = static_cast<WCHAR>(L'"')
+ buffer
+ static_cast<WCHAR>(L'"');
我是一名优秀的程序员,十分优秀!