Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > ShellExecute в Win7


Автор: Vetlblya 9.6.2010, 19:17
Программа работала нормально под 32-разрядные XP и  Vista. Попробовал на 64-разрядной семерке и ShellEcexute отказалась работать. не запускается и не ругается. Может кто сталкивался с такой проблемой, какие методы решения возможны?

Запускаю WebMony:
Код

ShellExecute(0, nil, pchar('wmk:payto?Purse='R123456789123'&Amount='100'&Desc='Perevod sredstv'&BringToFront=Y'), '', '', SW_SHOW);

Delphi7

Автор: RomanEEP 9.6.2010, 21:12
Какой код ошибки возращает?

Автор: dvamaster 10.6.2010, 08:17
попробуй добавить операцию open

Код

ShellExecute(0, 'open', pchar('wmk:payto?Purse='R123456789123'&Amount='100'&Desc='Perevod sredstv'&BringToFront=Y'), '', '', SW_SHOW);

Автор: Vetlblya 10.6.2010, 08:29
Цитата(dvamaster @ 10.6.2010,  08:17)
попробуй добавить операцию open

Код

ShellExecute(0, 'open', pchar('wmk:payto?Purse='R123456789123'&Amount='100'&Desc='Perevod sredstv'&BringToFront=Y'), '', '', SW_SHOW);

пробовал с Open. результат тот же.

код на 32-разрядной - 42, на 64-разрядной - 42. 


Автор: Vetlblya 10.6.2010, 08:56
в нескольких источниках встречал подобную ошибку. в некоторых говорили про права доступа, но решения не давали. какие права и как надо назначить программе?

Автор: dvamaster 10.6.2010, 09:06
Цитата(Vetlblya @  10.6.2010,  11:29 Найти цитируемый пост)
код на 32-разрядной - 42, на 64-разрядной - 42. 


в заголовках нет такой ошибки  smile 

в МСДН нашел такое

http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx

в ремарках

Цитата
Because ShellExecute can delegate execution to Shell extensions (data sources, context menu handlers, verb implementations) that are activated using Component Object Model (COM), COM should be initialized before ShellExecute is called. Some Shell extensions require the COM single-threaded apartment (STA) type. In that case, COM should be initialized as shown here:


Код

CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE);

Автор: Vetlblya 10.6.2010, 09:26
Цитата(dvamaster @  10.6.2010,  09:06 Найти цитируемый пост)
Цитата(Vetlblya @  10.6.2010,  11:29 Найти цитируемый пост)
код на 32-разрядной - 42, на 64-разрядной - 42. 


в заголовках нет такой ошибки  smile 


может потому что это не ошибка, а ответ на нормальное выполнение ShellExecute.





Автор: CodeMonkey 10.6.2010, 12:33
Цитата(Vetlblya @  10.6.2010,  10:26 Найти цитируемый пост)
может потому что это не ошибка, а ответ на нормальное выполнение ShellExecute.

Вам только что сказали, что вы не вызвали CoInitialize(Ex).

Автор: Vetlblya 10.6.2010, 13:26
Цитата(CodeMonkey @ 10.6.2010,  12:33)
Цитата(Vetlblya @  10.6.2010,  10:26 Найти цитируемый пост)
может потому что это не ошибка, а ответ на нормальное выполнение ShellExecute.

Вам только что сказали, что вы не вызвали CoInitialize(Ex).

как оно вызывается-то? smile 

Автор: Vetlblya 10.6.2010, 13:54
вообще у кого-нибудь ShellExecute на 64х битных работала? если работала на какой делфе писали?

Автор: Rennigth 10.6.2010, 14:10
Цитата(Vetlblya @  10.6.2010,  13:26 Найти цитируемый пост)
как оно вызывается-то? 

Обычно в Initialization

Автор: Демо 10.6.2010, 14:14
Цитата(Vetlblya @  10.6.2010,  13:54 Найти цитируемый пост)
вообще у кого-нибудь ShellExecute на 64х битных работала? если работала на какой делфе писали?


У меня прекрасно работает в W7 x64.

Автор: Vetlblya 10.6.2010, 14:35
Цитата(Rennigth @ 10.6.2010,  14:10)
Цитата(Vetlblya @  10.6.2010,  13:26 Найти цитируемый пост)
как оно вызывается-то? 

Обычно в Initialization

уже голова пухнет, можно более конкретный пример? 

Автор: CodeMonkey 10.6.2010, 17:47
Цитата(Vetlblya @  10.6.2010,  15:35 Найти цитируемый пост)
можно более конкретный пример?  

http://lmgtfy.com/?q=Delphi+CoInitialize

Автор: Vetlblya 11.6.2010, 18:14
Цитата(CodeMonkey @ 10.6.2010,  17:47)
Цитата(Vetlblya @  10.6.2010,  15:35 Найти цитируемый пост)
можно более конкретный пример?  

http://lmgtfy.com/?q=Delphi+CoInitialize

чтоб тебе так в больнице помогали

Автор: CodeMonkey 11.6.2010, 19:23
Цитата(Vetlblya @  11.6.2010,  19:14 Найти цитируемый пост)
чтоб тебе так в больнице помогали 

Как вы полагаете вам помогут, если вы не сказали, в чём конкретно у вас затык возник?

Более изжёванный вопрос трудно себе представить. По первой ссылке всё прекрасно расписано.

Автор: Akella 11.6.2010, 20:18
Цитата(Vetlblya @ 11.6.2010,  18:14)
Цитата(CodeMonkey @ 10.6.2010,  17:47)
Цитата(Vetlblya @  10.6.2010,  15:35 Найти цитируемый пост)
можно более конкретный пример?  

http://lmgtfy.com/?q=Delphi+CoInitialize

чтоб тебе так в больнице помогали

чувак, тише будь, а то бан получишь от модераторов за грубость

Автор: Vetlblya 12.6.2010, 09:19
Цитата(Akella @  11.6.2010,  20:18 Найти цитируемый пост)
чувак, тише будь, а то бан получишь от модераторов за грубость


Есть люди, которые не живут программированием. Но иногда им приходится написать что-то. Также у них нет знакомых тру-программистов и в английском они не очень сильны. Перед тем как задать вопрос дооолго гуглил и ничего не понял. Мягко говоря задолбался, а проект начинает гореть. И советы пойти в гугл сильно раздражают. Если он не может помочь пусть сидит и не лезет. 

Если у кого имеется конкретный пример использования CoInitialize помогите, пожалуйста!!!

Автор: Rennigth 12.6.2010, 10:34
Цитата(Vetlblya @  12.6.2010,  09:19 Найти цитируемый пост)
Если у кого имеется конкретный пример использования CoInitialize помогите, пожалуйста!!!

Тебе все уже же сказали...
Есть такая функция CoInitialize(на сколько помню описана она в модуле ActiveX). Вообщем случае вызывать ее можно из любого места приложения, но естественно до того как ее вызов требуется. Самое простое или с конструкторе главной формы(если она у тебя есть) или в секции Initialization. Примерно так:
Код

Unit блаблабла
...

initialization // это пишется в самом конце модуля.
  CoInitialize(0);
  
 

Автор: CodeMonkey 12.6.2010, 13:10
Цитата(Vetlblya @  12.6.2010,  10:19 Найти цитируемый пост)
И советы пойти в гугл сильно раздражают.

Вы может чего не понимаете, но вам тут никто ничего не должен. Вам не приходило в голову, почему люди здесь отвечают за бесплатно? Потому что им интересно отвечать на интересные вопросы. Глупые вопросы - в гугл или за деньги.

Автор: Proxin 13.6.2010, 10:34
попробуй createprocess. и, к тому же, у shellexecute есть неприятный баг - в некоторых случаях фокус мыши не передаётся полноэкранному приложению.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)