2014-02-26 116 views
0

嘗試爲可執行文件創建加載程序時,如果參數中提供的字符串長度超過某個長度,則無法執行加載程序。但是參數是從初始化文件中完全讀取的。當參數=空時它也崩潰。將字符串附加到lpCmdLine WinMain

typedef int (__cdecl *ExecMain_t)(HINSTANCE, HINSTANCE, LPSTR, int); 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
HMODULE Loader = LoadLibraryExA(".\\library.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH); 

char* Parameters; 
CIniFile iniReader(".\\Configure.ini"); 
Parameters = iniReader.IniReadValue("App", "Parameters"); 

char xCommand[MAX_PATH] = {0}; 
_snprintf_s(xCommand, _TRUNCATE, "-verify "); //parameter from exe 
strcat_s(xCommand, _TRUNCATE, Parameters); 
strcpy_s(lpCmdLine, _TRUNCATE, xCommand); 

delete[] Parameters; 
Parameters = NULL; 

ExecMain_t procExecMain = (ExecMain_t)GetProcAddress(Loader,"ExecMain"); 
procExecMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); 

return 1; 
} 

崩潰描述:

問題事件名稱:APPCRASH 應用名稱:exec.exe 應用程序版本:0.0.0.0 應用程序時間戳:530df50a 故障模塊名稱:KERNELBASE.dll 故障模塊版本:6.2.9200.16384

編輯:試圖找出爲什麼當參數字符串長度增加時崩潰。如果我通過用「-verify」(通過參數從EXE)

EDIT2沿着多個字符

即使崩潰:通過_TRUNCATE替換MAX_PATH修改的代碼。似乎適用於參數中的某些字符,但超出時會崩潰。

+0

請張貼[SSCCE](HTTP ://www.sscce.org/)。您當前的代碼片段中沒有任何內容可以完全解釋您遇到的錯誤。 – ComicSansMS

+0

我編輯了代碼 – GaNi

+0

'strcpy'到'WinMain'的'lpCmdLine'聽起來像個不好主意。 – ComicSansMS

回答

0

這裏有幾個問題:

char xCommand[MAX_PATH] = {0}; 
_snprintf_s(xCommand, _TRUNCATE, "-verify "); //parameter from exe 
strcat_s(xCommand, _TRUNCATE, Parameters); 
strcpy_s(lpCmdLine, _TRUNCATE, xCommand); 

我認爲你應該使用strcpy_s代替_snprintf_s,畢竟我沒有看到你打印任何格式xCommand

然後,第二個參數_TRUNCATE實際上應該是MAX_PATH,因爲此函數的第二個參數是目標緩衝區的元素數。

但最重要的是,第三行是完全錯誤的,因爲您正在嘗試寫入輸入緩衝區lpCmdLine,並且會覆蓋超出緩衝區範圍的內存。您需要的是將原始緩衝區的內容複製到新的命令緩衝區中。像這樣的東西(請注意,我在瀏覽器中寫了這個代碼,因此它可能包含錯誤):

char xCommand[MAX_PATH] = {0}; 
strcpy_s(xCommand, MAX_PATH, lpCmdLine); // copy the original command line 
strcat_s(xCommand, MAX_PATH, " -verify "); // append 
strcat_s(xCommand, MAX_PATH, Parameters); // append 

,然後通過這個緩衝你的ExecMain功能:

procExecMain(hInstance, hPrevInstance, xCommand, nCmdShow); 
+0

我做了類似於您的解決方案的東西,但似乎xCommand完全被忽略。 lpCmdLine只是傳遞給Loader的東西。 – GaNi