Открывается мой любимый IrfanView со следующим баннером и с черным экраном: D:\src\test\temp.bmp
Can't read file header!
Unknown file format!
Если снять комментарий с задержки, то все OK. Стало быть что-то не успевает. Здесь непонятно, почему это происходит при вызове редактора Задержка то стоит ПОСЛЕ выхода из редактора!
Подозреваю, что для корректной работы (без искусственной задержки) надо пользовать CreateProcess и WaitForSingleObject. Но как это конкретно для моего примера написать, не врублюсь. Подскажите, плиз!
Здравствуйте, gs199, Вы писали:
G>Если снять комментарий с задержки, то все OK. Стало быть что-то не успевает.
ShellExecute работает асинхронно. Так что ты стираешь файл до того как он прочитан.
G>Подозреваю, что для корректной работы (без искусственной задержки) надо пользовать CreateProcess и WaitForSingleObject.
Правильно подохреваешь. А ещё можно использовать утилиту start.
Здравствуйте, gs199, Вы писали:
A>>Утилита командной строки. Искать не надо, она в папке System32
G>Не, что-то не так. У меня ХР и в system32 ничего подобного не обнаружено
Ничего страшного, зато командный интерпретатор windows ее понимает. Открой cmd.exe и набери start /?
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Здравствуйте, gs199, Вы писали:
A>>Утилита командной строки. Искать не надо, она в папке System32 G>Не, что-то не так. У меня ХР и в system32 ничего подобного не обнаружено
Хмм наврал. Мне казалось, что это утилита, а оказывается команда.
Вобщем набери в командной строке "start /?"
Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
Bitmap->Assign(Image1->Picture);
Bitmap->SaveToFile("temp.bmp");
// Новая часть выделена отступом
STARTUPINFO si;
PROCESS_INFORMATION pi;
GetStartupInfo(&si);
si.wShowWindow = SW_SHOWNORMAL;
if (!CreateProcess(NULL, "i_view32.exe temp.bmp",NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi))
ShowMessage("Error");
else {
WaitForSingleObject(pi.hProcess,INFINITE);
}
delete Bitmap;
DeleteFile("temp.bmp");
Это работает, если i_view32.exe перенести в рабочую директорию и в ней рисовать картинки. Стоит удалить iview32, как прога пишет мое сообщение "Error". Чего в супе не хватает? К тому же хотелось бы, чтобы файл открывался по ассоциациям bmp, т.к.на разных машинах разные граф-редакторы.
Здравствуйте, gs199, Вы писали:
G>Это работает, если i_view32.exe перенести в рабочую директорию и в ней рисовать картинки. Стоит удалить iview32, как прога пишет мое сообщение "Error". Чего в супе не хватает?
Полного пути не хватает в супе.
G>К тому же хотелось бы, чтобы файл открывался по ассоциациям bmp, т.к.на разных машинах разные граф-редакторы.
FindExecutable
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Здравствуйте, ekamaloff, Вы писали:
E>Полного пути не хватает в супе.
Понял, поправил.
G>>К тому же хотелось бы, чтобы файл открывался по ассоциациям bmp, т.к.на разных машинах разные граф-редакторы.
E>FindExecutable
А вот тут опять затык.
HINSTANCE hi;
LPTSTR lpR; // pointer to buffer for string for executable file on return
LPCTSTR lpD; // pointer to string for default directory
AnsiString AS = Path + "temp.bmp";
hi = FindExecutable(AS.c_str(), lpD, lpR);
В таком виде матерится при исполнении. Про параметры: AS — ансистринга с полным путем к bmp, в lpR по выходе как я понял должен образоваться путь к граф-редактору. А что ставить в lpD?
Здравствуйте, gs199, Вы писали:
E>>FindExecutable
G>А вот тут опять затык. G>
G> HINSTANCE hi;
G> LPTSTR lpR; // pointer to buffer for string for executable file on return
G> LPCTSTR lpD; // pointer to string for default directory
G> AnsiString AS = Path + "temp.bmp";
G> hi = FindExecutable(AS.c_str(), lpD, lpR);
G>
G>В таком виде матерится при исполнении. Про параметры: AS — ансистринга с полным путем к bmp, в lpR по выходе как я понял должен образоваться путь к граф-редактору. А что ставить в lpD?
Матерится в том числе потому, что lpR у тебя указатель на неинициализированную память, а ты должен передать адрес буфера размером не меньше sizeof(TCHAR) * MAX_PATH. Вместо lpD думаю можно передавать NULL. В-общем нечто такое получаетсч:
HISNTANCE hi;
TCHAR buf[MAX_PATH];
AnsiString AS = Path + "temp.bmp";
hi = FindExecutable(AS.c_str(), NULL, buf);
Если NULL не прокатит, попробуй пустую строку
Кстати есть еще функция AssocQueryString, для нее необязательно наличие файла, достаточно знать только расширение.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
E>Кстати есть еще функция AssocQueryString, для нее необязательно наличие файла, достаточно знать только расширение.
Спасибо! Все пашет. Поставил тебе "спасибо", Не знаю, правда, на что это влияет
Чтоб уж совсем добить эту проблему: пишу на ком-строке в произвольной директории bcb — вызывается мой Билдер. Пишу там же i_view32 — получаю "нет такого файла". Хотя ни того, ни другого в system32 нет. Оба — в соответствующих папочках Program Files. Это почему такое неравноправие? Они по-разному прописаны в реестре, что ли?
Здравствуйте, gs199, Вы писали:
G>Чтоб уж совсем добить эту проблему: пишу на ком-строке в произвольной директории bcb — вызывается мой Билдер. Пишу там же i_view32 — получаю "нет такого файла". Хотя ни того, ни другого в system32 нет. Оба — в соответствующих папочках Program Files. Это почему такое неравноправие? Они по-разному прописаны в реестре, что ли?
bcb добавляет свои пути к environment variable PATH (для win9x это в autoexec.bat, для NT — MyComputer — Properties — Advanced — environment variables)