|
|
  |
Как сформировать коммандную строку из программы, Borland C++ Builder (правильно указать путь) |
|
|
|
Jan 31 2011, 17:14
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Есть во такой обработчик нажатия кнопки: Код void __fastcall TForm1::Button6Click(TObject *Sender) { char * command="BIN2HEX H:\fv.bin H:\fv.hex"; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); // Start the child process. if( !CreateProcess( NULL, // No module name (use command line) command, // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE 0, // No creation flags NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi ) // Pointer to PROCESS_INFORMATION structure ) { AnsiString ErrStr=AnsiString( "CreateProcess failed. Error code=" ) + AnsiString(GetLastError()); ShowMessage(ErrStr); return; } // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } Он запускает коммандную строку char * command="BIN2HEX H:\fv.bin H:\fv.hex"; Мне нужно чтобы вместо H: автоматически подставлялся путь к месту запуска программы, в которой присутствует вышеупомянутый обработчик. Я пробовал скроить строчку: char * command="BIN2HEX "+ExtractFileDir(Application->ExeName)+"\fv.bin"+" "+ExtractFileDir(Application->ExeName)+"\fv.hex"; но ничего не вышло. Пишет ошибку: [C++ Error] Unit1.cpp(306): E2034 Cannot convert 'AnsiString' to 'char *' Как правильно это сделать? Спасибо.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Feb 1 2011, 07:19
|
Местный
  
Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868

|
Вопрос попроще. Есть строка: Код char * command="avrosp.exe -cCOM3 -dATtiny2313 -e -pf -iffv22.hex"; Мне нужно менять в ней из программы адрес порта. Делаю так: Код AnsiString * cml; * cml = Label1->Caption; char * command= cml; Получаю ошибку: [C++ Error] Unit1.cpp(37): E2034 Cannot convert 'AnsiString *' to 'char *' Как делать правильно? Спасибо.
|
|
|
|
|
Feb 1 2011, 08:16
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(skyled @ Feb 1 2011, 11:19)  Вопрос попроще. Есть строка: Код char * command="avrosp.exe -cCOM3 -dATtiny2313 -e -pf -iffv22.hex"; Мне нужно менять в ней из программы адрес порта. Делаю так: Код AnsiString * cml; * cml = Label1->Caption; char * command= cml; Получаю ошибку: [C++ Error] Unit1.cpp(37): E2034 Cannot convert 'AnsiString *' to 'char *' Как делать правильно? Спасибо. Ну так посмотрите методы AnsiString, будет нечто вроде Код cml = Label1->Caption.c_str(); У меня нет под рукой сейчас Builder, так что более точно я ответить не смогу.
|
|
|
|
|
Feb 1 2011, 08:30
|
Местный
  
Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868

|
Код cml = Label1->Caption.c_str(); Всетаки заработало! Спасибо.
Сообщение отредактировал skyled - Feb 1 2011, 08:50
|
|
|
|
|
Feb 1 2011, 08:47
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(skyled @ Feb 1 2011, 12:30)  Код cml = Label1->Caption.c_str(); 100500 нижайших благодарностей! Заработало. Где Вы это все вычитали? В мою бытность Фортран учил с бейсиком пополам. Ну так а Help для чего существует. AnsiSring->Properties, Methods ... и т.д. Ну Фортран, Бейсик, Паскаль это как-то походя при случаях приходилось смотреть. А так - машинный код, ассемблер, Си. Ну и Builder приходилось пользовать. Только сразу скажу - в плюсплюснутом Си я не силен.
|
|
|
|
|
Feb 1 2011, 14:13
|
Местный
  
Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868

|
Вот такую ошибку
получаю в этом месте
Хотелось бы знать природу. Вышеупомянутый код раньше работал.После того как программа усложнилась появилась эта проблема. Откуда у нее что растет? Спасибо.
|
|
|
|
|
Feb 1 2011, 14:57
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(skyled @ Feb 1 2011, 18:13)  Вот такую ошибку
получаю в этом месте
Хотелось бы знать природу. Вышеупомянутый код раньше работал.После того как программа усложнилась появилась эта проблема. Откуда у нее что растет? Спасибо. Нужно проверять результат функции fopen()!!! Если файл по некоторым причинам не смог открыться, fopen возвращает нулевой результат вместо указателя на структуру FILE.
|
|
|
|
|
Feb 1 2011, 17:23
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 25-12-07
Пользователь №: 33 632

|
OpenDialog и SaveDialog наверняка используют API GetOpenFileName и GetSaveFileName, которые меняют текущую директорию процесса, если не установлен флаг OFN_NOCHANGEDIR.
Хотя на самом деле проблема в том, что в программе отсутствует обработка ошибок и используются относительные пути.
|
|
|
|
|
Feb 2 2011, 08:03
|
Местный
  
Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868

|
Код unsigned char bin_code[2034]; Массив, вкоторый я читаю бинарный файл. Цитата OpenDialog и SaveDialog наверняка используют API GetOpenFileName и GetSaveFileName, которые меняют текущую директорию процесса, если не установлен флаг OFN_NOCHANGEDIR. Включил эту опцию. Помогло.
Сообщение отредактировал skyled - Feb 2 2011, 08:06
|
|
|
|
|
Feb 2 2011, 11:34
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 25-12-07
Пользователь №: 33 632

|
Цитата Относительные пути использовать прийдется, т.к. не известно куда программа может встать. Да и на настольном и на ноуте у одного и того же пользователя может оказаться в разных папках. А файлы с данными вообще на флешке. Путь можно выдрать из имени выполняющегося файла. Цитата Еще интересное поведение OpenDialog -- пока нет русских букв в пути, все в порядке. Как только присутствует, так после выбора файла приложение просто молча закрывается без всяких предупреждений и ошибок С чем это может быть связано? Открою секрет - в BCB есть дебаггер
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|