Проблема с ShellExecute
От: gs199 Россия  
Дата: 03.05.06 07:02
Оценка:
Хочу передать картинку, нарисованную моей прогой, в графредактор. Пишу (BCB):
  Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
  Bitmap->Assign(Image1->Picture);
  Bitmap->SaveToFile("temp.bmp");
  ShellExecute(Handle, "open", "temp.bmp", NULL, NULL, SW_SHOWNORMAL);
  delete Bitmap;
//  Sleep(300);
  DeleteFile("temp.bmp");

Открывается мой любимый IrfanView со следующим баннером и с черным экраном:
D:\src\test\temp.bmp
Can't read file header!
Unknown file format!

Если снять комментарий с задержки, то все OK. Стало быть что-то не успевает. Здесь непонятно, почему это происходит при вызове редактора Задержка то стоит ПОСЛЕ выхода из редактора!
Подозреваю, что для корректной работы (без искусственной задержки) надо пользовать CreateProcess и WaitForSingleObject. Но как это конкретно для моего примера написать, не врублюсь. Подскажите, плиз!
Re: Проблема с ShellExecute
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.05.06 07:06
Оценка:
Здравствуйте, gs199, Вы писали:

G>Если снять комментарий с задержки, то все OK. Стало быть что-то не успевает.


ShellExecute работает асинхронно. Так что ты стираешь файл до того как он прочитан.

G>Подозреваю, что для корректной работы (без искусственной задержки) надо пользовать CreateProcess и WaitForSingleObject.


Правильно подохреваешь. А ещё можно использовать утилиту start.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Проблема с ShellExecute
От: altarvic  
Дата: 03.05.06 07:09
Оценка:
Используй ShellExecuteEx
Re[2]: Проблема с ShellExecute
От: mgoncharenko  
Дата: 03.05.06 08:56
Оценка:
> Используй ShellExecuteEx

Или CreateProcess.
Posted via RSDN NNTP Server 2.0
Re[2]: Проблема с ShellExecute
От: gs199 Россия  
Дата: 03.05.06 09:30
Оценка:
Здравствуйте, altarvic, Вы писали:

A>Используй ShellExecuteEx


Спасибо. У ней всего один параметр, но зато какой

typedef struct _SHELLEXECUTEINFO {   // sei  
    DWORD     cbSize; 
    ULONG     fMask; 
    HWND      hwnd; 
    LPCSTR    lpVerb; 
    LPCSTR    lpFile; 
    LPCSTR    lpParameters; 
    LPCSTR    lpDirectory; 
    int       nShow; 
    HINSTANCE hInstApp; 
 
    // Optional members 
    LPVOID lpIDList; 
    LPCSTR lpClass; 
    HKEY   hkeyClass; 
    DWORD  dwHotKey; 
    HANDLE hIcon; 
    HANDLE hProcess; 
} SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO;

Помогите заполнить структуру для моего примера (корневое сообщение)
Re[2]: Проблема с ShellExecute
От: gs199 Россия  
Дата: 03.05.06 09:36
Оценка:
Здравствуйте, adontz, Вы писали:

A>Правильно подохреваешь. А ещё можно использовать утилиту start.


A start — это что такое? Где про него искать ?
Re[3]: Проблема с ShellExecute
От: ekamaloff Великобритания  
Дата: 03.05.06 09:41
Оценка:
Здравствуйте, gs199, Вы писали:

G>Помогите заполнить структуру для моего примера (корневое сообщение)


На Delphi пример подойдет?

Re: Запуск приложения в контексте свое консоли
Автор: ekamaloff
Дата: 20.03.06
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[3]: Проблема с ShellExecute
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.05.06 09:57
Оценка:
Здравствуйте, gs199, Вы писали:

G>A start — это что такое? Где про него искать ?


Утилита командной строки. Искать не надо, она в папке System32
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Проблема с ShellExecute
От: ekamaloff Великобритания  
Дата: 03.05.06 10:22
Оценка:
Здравствуйте, adontz, Вы писали:

A>Правильно подохреваешь. А ещё можно использовать утилиту start.


Это как она тут может пригодиться?
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: Проблема с ShellExecute
От: gs199 Россия  
Дата: 03.05.06 11:54
Оценка:
Здравствуйте, adontz, Вы писали:

G>>A start — это что такое? Где про него искать ?


A>Утилита командной строки. Искать не надо, она в папке System32


Не, что-то не так. У меня ХР и в system32 ничего подобного не обнаружено
Re[5]: Проблема с ShellExecute
От: ekamaloff Великобритания  
Дата: 03.05.06 11:59
Оценка:
Здравствуйте, 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
Re[5]: Проблема с ShellExecute
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.05.06 12:02
Оценка:
Здравствуйте, gs199, Вы писали:

A>>Утилита командной строки. Искать не надо, она в папке System32

G>Не, что-то не так. У меня ХР и в system32 ничего подобного не обнаружено

Хмм наврал. Мне казалось, что это утилита, а оказывается команда.
Вобщем набери в командной строке "start /?"
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Проблема с ShellExecute
От: gs199 Россия  
Дата: 03.05.06 12:09
Оценка:
Вот чего я достиг:
  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, т.к.на разных машинах разные граф-редакторы.
Re[2]: Проблема с ShellExecute
От: ekamaloff Великобритания  
Дата: 03.05.06 12:21
Оценка:
Здравствуйте, 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
Re[3]: Проблема с ShellExecute
От: gs199 Россия  
Дата: 03.05.06 14:15
Оценка:
Здравствуйте, 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?
Re[4]: Проблема с ShellExecute
От: ekamaloff Великобритания  
Дата: 03.05.06 14:26
Оценка: 2 (1)
Здравствуйте, 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
Re[5]: Проблема с ShellExecute
От: gs199 Россия  
Дата: 03.05.06 16:31
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, gs199, Вы писали:


E>
E>HISNTANCE hi;
E>TCHAR buf[MAX_PATH];
E>AnsiString AS = Path + "temp.bmp";
E>hi = FindExecutable(AS.c_str(), NULL, buf);
E>


E>Кстати есть еще функция AssocQueryString, для нее необязательно наличие файла, достаточно знать только расширение.


Спасибо! Все пашет. Поставил тебе "спасибо", Не знаю, правда, на что это влияет
Чтоб уж совсем добить эту проблему: пишу на ком-строке в произвольной директории bcb — вызывается мой Билдер. Пишу там же i_view32 — получаю "нет такого файла". Хотя ни того, ни другого в system32 нет. Оба — в соответствующих папочках Program Files. Это почему такое неравноправие? Они по-разному прописаны в реестре, что ли?
Re[6]: Проблема с ShellExecute
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 04.05.06 03:23
Оценка:
Здравствуйте, gs199, Вы писали:

G>Чтоб уж совсем добить эту проблему: пишу на ком-строке в произвольной директории bcb — вызывается мой Билдер. Пишу там же i_view32 — получаю "нет такого файла". Хотя ни того, ни другого в system32 нет. Оба — в соответствующих папочках Program Files. Это почему такое неравноправие? Они по-разному прописаны в реестре, что ли?


bcb добавляет свои пути к environment variable PATH (для win9x это в autoexec.bat, для NT — MyComputer — Properties — Advanced — environment variables)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.