2012-06-09 3 views
0

У меня есть следующий код, который отлично работает до последней строки в DskPrt1.txt assign letter=. Файл записывается так, как должен. В раскрывающемся списке я выбираю букву диска, отправлю выбранную букву в FILE fp, напишите ее, а затем направьте diskpart, чтобы прочитать ее. Это выходdiskpart ошибка чтения из файла

Том 1 является выбранным уровнем громкости

аргументов, заданные для этой команды не действителен.

Это говорит мне, что он делает все до второй строки в DskPrt.txt. Я скопировал и вставил assign letter=X в diskpart вручную, и он работает просто отлично. Почему он не работает с моим кодом?

Часть 1

SendMessage( 
(HWND) hWndDropMenu, // handle to destination window 
CB_GETLBTEXT,   // message to send 
(WPARAM) wParam,  // not used; must be zero 
(LPARAM)tmpMsg   // not used; must be zero 
); 

Часть 2

FILE *fp; 
fp = fopen("DskPrt1.txt", "wt"); 
char DskPrt11[] = "select volume 1"; 
char DskPrt12[] = "assign letter="; 
fwrite (DskPrt11 , 1 , sizeof(DskPrt11) , fp);   //Line 1 
fwrite("\n", sizeof(char), 1, fp);      //New line 
fwrite (DskPrt12 , 1 , sizeof(DskPrt12) , fp);   //Line 2 
fwrite (tmpMsg , 1 , sizeof(tmpMsg) , fp);    //Letter 
fclose(fp); 

//Execute part 1 commands 
std::wstring arrString[3] = {L"/C mkdir C:\\Users\\Andrew\\Desktop\\test",L"/C DISKPART /s C:\\Users\\Andrew\\Desktop\\DskPrt1.txt"}; 
LPWSTR cmd =L"C:\\Windows\\System32\\cmd.exe"; 
for(int i=0; i<2; i++) 
{ 
    STARTUPINFO info={sizeof(info)}; 
    PROCESS_INFORMATION processInfo; 
    CreateProcessW(cmd, &arrString[i][0], NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &info, &processInfo); 
    ::WaitForSingleObject(processInfo.hProcess, INFINITE); 
    CloseHandle(processInfo.hProcess); 
    CloseHandle(processInfo.hThread); 
} 

ответ

1

Из-за этого:

fwrite (DskPrt11 , 1 , sizeof(DskPrt11) , fp); 

Используя SizeOf(), вы в том числе нуль-терминатор. Таким образом, ваш файл заканчивается как минимум двумя нулевыми байтами, которые вам не нужны. Вместо этого используйте strlen().

+0

Это работает только сейчас, когда не записывается выбранный символ. Если я выберу «G», он записывает «A» в файл. Если я выберу «N», он назначит «B». – arynhard

+0

Это потому, что ваш вызов SendMessage ошибочен. В ваших комментариях вы говорите, что wParam должен быть равен нулю, но это неверно. wParam должен быть индексом элемента списка, который вы хотите получить. http://msdn.microsoft.com/en-us/library/windows/desktop/bb775862%28v=vs.85%29.aspx –

Смежные вопросы