2011-10-16 21 views
0

ARGI有一些代碼:麻煩與lpCommandLine中的CreateProcess()

CreateProcess(L"D:\\prog\\forLb1SPZ.exe",L"D:\\prog\\forLb1SPZ.exe D:\\1.txt",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi) 

此代碼工作,但...文件創建程序(如果這個代碼寫)附近,有名稱爲「d」 - argv [1]的第一個符號。什麼問題?

守則forLb1SPZ.exe

#include "stdafx.h" 
#include "iostream" 
#include <stdio.h> 
#include <math.h> 
using namespace std; 

int _tmain(int argc, char* argv[]) 
{ 
    int value; 
    FILE *Ptr; 

    Ptr=fopen("argv[1]","w"); 

    for(int i=0;i<20000;i++){ 
     value=rand(); 
    fprintf(Ptr,"%d i=%d \n",value,i); 
    } 

    fclose(Ptr); 
    return 0; 
} 

守則lab2SPZ.exe(主程序)

#include "stdafx.h" 
#include "iostream" 
#include <windows.h> 
#include <stdio.h> 
using namespace std; 

int main() 
{ 
STARTUPINFO si; 
PROCESS_INFORMATION pi; 
ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 

if(!CreateProcess(L"D:\\forLb1SPZ.exe","D:\\forLb1SPZ.exe D:\\1.txt",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) 
{printf("creating fail\n");system("pause");return 0;} 




printf("handle: %X\n", pi.hProcess); 
WaitForSingleObject(pi.hProcess, INFINITE); 


system("pause"); 
return 0; 
} 
+0

這不能編譯。發佈真實的代碼。不要將const char *作爲lpCommandLine傳遞。 –

回答

2

你確定這是CreateProcess這是創造該文件,而不是forLb1SPZ.exe?

注:

  1. 您使用的寬字符串。如果forLb1SPZ.exe使用ANSI字符串,則可能會在D後面看到一個\ 0。如果應該說打開「D:\ 1.txt」,它可能會將文件名稱視爲「D」(我不是正面的對此,但我想操作系統不會轉換編碼,我可能是錯的,而且確實如此)。嘗試使用CreateProcessA,看看是否有區別。
  2. 第二個參數必須是LPTSTR而不是LPCTSTR。您傳遞的是字符串文字,根據文檔可能會更改該字符串CreateProcess。如果發生這種情況,您將會遇到未定義的行爲,並可能導致崩潰。
  3. 您正在第一個和第二個參數中傳遞應用程序名稱。這通常是多餘的。這是故意的嗎?
+0

文件是由forLb1SPZ.exe創建的,但它出現在其他目錄中。我試圖像你說的那樣做(大約\ 0),但問題是一樣的。在orLb1SPZ我試圖打開'ptr = fopen(「D:\\ 1.txt」,「w」);'它正在工作。使用'CreateProcessA'後沒有區別。 – user998116

+0

您能否發佈在forLb1SPZ.exe中創建文件的(真實)代碼?由於'CreateProcess'中的'lpCurrentDirectory'爲NULL,因此forLb1SPZ.exe將獲取調用進程的當前目錄。當我們弄清楚完整路徑如何變成「D」時,問題就會解決。 – eran

+0

我剛剛編輯了我的問題。 – user998116