реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как сформировать коммандную строку из программы, Borland C++ Builder (правильно указать путь)
smk
сообщение Jan 31 2011, 17:14
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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 *' Как правильно это сделать? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
skyled
сообщение Feb 1 2011, 07:19
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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 *'
Как делать правильно? Спасибо.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Feb 1 2011, 08:16
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 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, так что более точно я ответить не смогу.
Go to the top of the page
 
+Quote Post
skyled
сообщение Feb 1 2011, 08:30
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Код
cml = Label1->Caption.c_str();

Всетаки заработало! Спасибо.

Сообщение отредактировал skyled - Feb 1 2011, 08:50
Go to the top of the page
 
+Quote Post
_Bill
сообщение Feb 1 2011, 08:47
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(skyled @ Feb 1 2011, 12:30) *
Код
cml = Label1->Caption.c_str();

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

Ну так а Help для чего существует. AnsiSring->Properties, Methods ... и т.д.
Ну Фортран, Бейсик, Паскаль это как-то походя при случаях приходилось смотреть. А так - машинный код, ассемблер, Си. Ну и Builder приходилось пользовать. Только сразу скажу - в плюсплюснутом Си я не силен.
Go to the top of the page
 
+Quote Post
skyled
сообщение Feb 1 2011, 14:13
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Вот такую ошибку
Прикрепленное изображение

получаю в этом месте
Прикрепленное изображение

Хотелось бы знать природу. Вышеупомянутый код раньше работал.После того как программа усложнилась появилась эта проблема. Откуда у нее что растет? Спасибо.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Feb 1 2011, 14:57
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(skyled @ Feb 1 2011, 18:13) *
Вот такую ошибку
Прикрепленное изображение

получаю в этом месте
Прикрепленное изображение

Хотелось бы знать природу. Вышеупомянутый код раньше работал.После того как программа усложнилась появилась эта проблема. Откуда у нее что растет? Спасибо.

Нужно проверять результат функции fopen()!!! Если файл по некоторым причинам не смог открыться, fopen возвращает нулевой результат вместо указателя на структуру FILE.
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 1 2011, 16:57
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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

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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
E.S.
сообщение Feb 1 2011, 17:23
Сообщение #9


Участник
*

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



OpenDialog и SaveDialog наверняка используют API GetOpenFileName и GetSaveFileName, которые меняют текущую директорию процесса, если не установлен флаг OFN_NOCHANGEDIR.

Хотя на самом деле проблема в том, что в программе отсутствует обработка ошибок и используются относительные пути.
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 2 2011, 05:26
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Относительные пути использовать прийдется, т.к. не известно куда программа может встать. Да и на настольном и на ноуте у одного и того же пользователя может оказаться в разных папках. А файлы с данными вообще на флешке.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Feb 2 2011, 07:18
Сообщение #11


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



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

bin_code - это у вас что? На вид массив, но тогда не надо амперсенд перед ним ставить в операторе fread, т.е. само имя bin_code уже адрес.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Feb 2 2011, 07:47
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



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



Сообщение отредактировал _Bill - Feb 2 2011, 07:50
Go to the top of the page
 
+Quote Post
skyled
сообщение Feb 2 2011, 08:03
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Код
unsigned char bin_code[2034];
Массив, вкоторый я читаю бинарный файл.
Цитата
OpenDialog и SaveDialog наверняка используют API GetOpenFileName и GetSaveFileName, которые меняют текущую директорию процесса, если не установлен флаг OFN_NOCHANGEDIR.
Включил эту опцию. Помогло.

Сообщение отредактировал skyled - Feb 2 2011, 08:06
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 2 2011, 10:37
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Еще интересное поведение OpenDialog -- пока нет русских букв в пути, все в порядке. Как только присутствует, так после выбора файла приложение просто молча закрывается без всяких предупреждений и ошибок
С чем это может быть связано?
Go to the top of the page
 
+Quote Post
E.S.
сообщение Feb 2 2011, 11:34
Сообщение #15


Участник
*

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



Цитата
Относительные пути использовать прийдется, т.к. не известно куда программа может встать. Да и на настольном и на ноуте у одного и того же пользователя может оказаться в разных папках. А файлы с данными вообще на флешке.

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

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

Открою секрет - в BCB есть дебаггер wink.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01489 секунд с 7
ELECTRONIX ©2004-2016