2012-04-19 63 views
0

我有一段代碼中,我需要使用與:: ifstream的打開和CreateProcess的兩個字符串,像使用與ifstream的寬字符串::打開或字節字符串與CreateProcess的

//in another file 
const char* FILENAME = "C:\\...blah blah\\filename.bat"; 

// in main app 
std::ifstream is; 
is.open(FILENAME); 
// ...do some writing 
is.close(); 

STARTUPINFO si; 
PROCESS_INFORMATION pi; 

ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 

std::string cmdLine = "/c " + FILENAME; 

if(!CreateProcess("c:\\Windows\\system32\\cmd.exe", 
    cmdLine.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) 
{  
    return GetLastError(); 
} 

CreateProcess需要一個LPCWSTR,所以要在CreateProcess中使用該字符串我需要聲明文件名和'cmdLine'爲std :: wstring,但ifstream :: open不需要寬字符串......我可以'想想辦法解決這個問題。我似乎總是遇到unicode與多字節字符串的問題。

任何想法? 謝謝。

+1

您可以使用例如['mbstowcs'](http://en.cppreference.com/w/cpp/string/multibyte/mbstowcs)從'char *'轉換爲'wchar_t *'。 – 2012-04-19 12:08:18

回答

1

我假設你定義了UNICODE。您可以將STARTUPINFO更改爲STARTUPINFOACreateProcessCreateProcessA,它應該可以正常工作(它對我來說)。

雖然我不認爲它會喜歡+操作。將一個字符數組顯式轉換爲字符串。

std::string cmdLine = (std::string)"/c " + FILENAME; 

最後,你將需要大約的開始和結束FILENAME報價,如果它有一個空間。

const char FILENAME = "\"C:\\Program Files\\Company\\Program\\program.exe\""; 
         ^  ^         ^

編輯: 嘗試把這個你的字符串聲明如下:

char charCmdLine [MAX_PATH + 3]; //"/c " is 3 extra chars 
strncpy (charCmdLine, cmdLine.c_str(), MAX_PATH + 3); 

然後,在CreateProcess而不是cmdLine.c_str()使用charCmdLine

+0

是的Unicode是定義,現在好了我得到的錯誤: CreateProcessA':不能將參數2從'const char *'轉換爲'LPSTR' 編輯 - 我不知道如何編輯正確,但斜體字我寫了一個星號,他們應該是指針 但LPSTR只是char *正確? = S – 2012-04-19 12:19:29

+1

const char *是LPCSTR,它是'c_str()'返回的內容。然後你可能不得不把它複製到一個新的緩衝區中,但是它令人驚訝,它並沒有給我一個警告或任何東西。編輯:沒關係,它確實給了我一個警告>< – chris 2012-04-19 12:23:12

+0

這是因爲constability的區別,它期望LPSTR不是LPCSTR,我可以在沒有const_cast的情況下解決這個問題嗎? – 2012-04-19 12:26:10