Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сформировать коммандную строку из программы
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
smk
Есть во такой обработчик нажатия кнопки:
Код
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 *' Как правильно это сделать? Спасибо.
skyled
Вопрос попроще. Есть строка:
Код
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 *'
Как делать правильно? Спасибо.
_Bill
Цитата(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, так что более точно я ответить не смогу.
skyled
Код
cml = Label1->Caption.c_str();

Всетаки заработало! Спасибо.
_Bill
Цитата(skyled @ Feb 1 2011, 12:30) *
Код
cml = Label1->Caption.c_str();

100500 нижайших благодарностей! Заработало. Где Вы это все вычитали? В мою бытность Фортран учил с бейсиком пополам.

Ну так а Help для чего существует. AnsiSring->Properties, Methods ... и т.д.
Ну Фортран, Бейсик, Паскаль это как-то походя при случаях приходилось смотреть. А так - машинный код, ассемблер, Си. Ну и Builder приходилось пользовать. Только сразу скажу - в плюсплюснутом Си я не силен.
skyled
Вот такую ошибкуНажмите для просмотра прикрепленного файла
получаю в этом местеНажмите для просмотра прикрепленного файла
Хотелось бы знать природу. Вышеупомянутый код раньше работал.После того как программа усложнилась появилась эта проблема. Откуда у нее что растет? Спасибо.
_Bill
Цитата(skyled @ Feb 1 2011, 18:13) *
Вот такую ошибкуНажмите для просмотра прикрепленного файла
получаю в этом местеНажмите для просмотра прикрепленного файла
Хотелось бы знать природу. Вышеупомянутый код раньше работал.После того как программа усложнилась появилась эта проблема. Откуда у нее что растет? Спасибо.

Нужно проверять результат функции fopen()!!! Если файл по некоторым причинам не смог открыться, fopen возвращает нулевой результат вместо указателя на структуру FILE.
smk
Цитата(_Bill @ Feb 1 2011, 16:57) *
Нужно проверять результат функции fopen()!!! Если файл по некоторым причинам не смог открыться, fopen возвращает нулевой результат вместо указателя на структуру FILE.

Вы натолкнули меня на мысль. Дело в том, что эта ошибка проявляется всякий раз, когда я открываю или сохраняю файл с данными посредством OpenDialog или SaveDialog. Поскольку хранятся файлы с данными в одной папке, а открываемый файл в другой, то возможно это причина. Такое может быть?
E.S.
OpenDialog и SaveDialog наверняка используют API GetOpenFileName и GetSaveFileName, которые меняют текущую директорию процесса, если не установлен флаг OFN_NOCHANGEDIR.

Хотя на самом деле проблема в том, что в программе отсутствует обработка ошибок и используются относительные пути.
smk
Относительные пути использовать прийдется, т.к. не известно куда программа может встать. Да и на настольном и на ноуте у одного и того же пользователя может оказаться в разных папках. А файлы с данными вообще на флешке.
Xenia
Цитата(skyled @ Feb 1 2011, 17:13) *
Вот такую ошибку получаю в этом месте. Хотелось бы знать природу. Вышеупомянутый код раньше работал.После того как программа усложнилась появилась эта проблема. Откуда у нее что растет? Спасибо.

bin_code - это у вас что? На вид массив, но тогда не надо амперсенд перед ним ставить в операторе fread, т.е. само имя bin_code уже адрес.
_Bill
Цитата(Xenia @ Feb 2 2011, 11:18) *
bin_code - это у вас что? На вид массив, но тогда не надо амперсенд перед ним ставить в операторе fread, т.е. само имя bin_code уже адрес.

skyled
Код
unsigned char bin_code[2034];
Массив, вкоторый я читаю бинарный файл.
Цитата
OpenDialog и SaveDialog наверняка используют API GetOpenFileName и GetSaveFileName, которые меняют текущую директорию процесса, если не установлен флаг OFN_NOCHANGEDIR.
Включил эту опцию. Помогло.
toweroff
Еще интересное поведение OpenDialog -- пока нет русских букв в пути, все в порядке. Как только присутствует, так после выбора файла приложение просто молча закрывается без всяких предупреждений и ошибок
С чем это может быть связано?
E.S.
Цитата
Относительные пути использовать прийдется, т.к. не известно куда программа может встать. Да и на настольном и на ноуте у одного и того же пользователя может оказаться в разных папках. А файлы с данными вообще на флешке.

Путь можно выдрать из имени выполняющегося файла.

Цитата
Еще интересное поведение OpenDialog -- пока нет русских букв в пути, все в порядке. Как только присутствует, так после выбора файла приложение просто молча закрывается без всяких предупреждений и ошибок
С чем это может быть связано?

Открою секрет - в BCB есть дебаггер wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.