ShellExecute ERROR_ACCESS_DENIED

Fly`
Дата: 05.06.2009 01:05:22
По нажатию на кнопку нужно попасть на страницу www.yandex.ru .
как делаю :
        
  k := ShellAPI.ShellExecute(Handle, 'open', PChar('www.yandex.ru'), nil, nil, SW_SHOWNORMAL);
  ShowMessage(IntToStr(K));
результат : браузер страницу не открывает, к = 5 // ERROR_ACCESS_DENIED

в процессе отладки вместо приведенного кода написал несколько другой :
        
  k := ShellAPI.ShellExecute(Handle, 'open', PChar('c:\1.htm'), nil, nil, SW_SHOWNORMAL);
  ShowMessage(IntToStr(K));
результат : браузер страницу открыл, к = 33

При этом в самом браузере естественно www.yandex.ru открывается.
Да, и касперский отключен :-)

Че за фигня ? никак в толк не возьму. Киньте мысли, плиз, ато мозг сломается :-)
_Vasilisk_
Дата: 05.06.2009 01:18:00
PChar('http://www.yandex.ru/')
?

С уважением, Vasilisk
Fly`
Дата: 05.06.2009 01:27:08
_Vasilisk_, то же самое. ERROR_ACCESS_DENIED
zirra
Дата: 05.06.2009 01:35:39

On Fri, 05 Jun 2009 02:05:22 +0400, Fly` <nospam@sql.ru> wrote:

> Автор: Fly`
> результат : браузер страницу не открывает, к = 5 // ERROR_ACCESS_DENIED

У меня твой код нормально отрабатывает... К = 42... %))

Posted via ActualForum NNTP Server 1.4

Fly`
Дата: 05.06.2009 01:44:37
zirra,
Да в том-то и дело, что я понимаю, что он должен отрабатывать. Потому извилина на извилину и не ложатся :-)

Так. ну ладно. что должно происходить по существу и как я дошел до кнопки. В идеале у меня RichEdit с сылкой, при нажатии на которую должен открываться браузер. Код взял отсюда .

Когда этот код написал вчистую в новом проекте. Всё работает. Как попытался внедрить к себе в старый проект - не работает. В результате повесил на кнопку ShellExecute - и не работает. Не пойму почему. Весь код вроде бы сюда не вывалить там 1300 строк... (
Fly`
Дата: 05.06.2009 01:45:48
Как подсветить ссылки в TRichEdit

Вы хотите, чтобы TRichEdit автоматически подчеркивал ссылки на Интренет ресурсы в вашем приложении? Вот как этого можно добиться:
Во обработчике обытия OnCreate пишем что-то вроде:
procedure TForm1.FormCreate(Sender: TObject);
var
mask: Word;
begin
mask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0);
SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK);
SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0);
RichEdit1.Text := 'SwissDelphiCenter.com: '#13#10 +
' Site is located at www.SwissDelphiCenter.com';
end;
После этого ваш редактор будет выделять ссылки.

Если же вы желаете, чтобы кроме всего прочего был возможен переход по ним, следует написать обработчик события. В форме объявляем функцию, которая будет обрабатывать нажатие на ссылку:
type
TForm1 = class(TForm)
protected
procedure WndProc(var Message: TMessage); override;
end;
{...}
procedure TForm1.WndProc(var Message: TMessage);
var
p: TENLink;
strURL: string;
begin
if (Message.Msg = WM_NOTIFY) then
begin
if (PNMHDR(Message.lParam).code = EN_LINK) then
begin
p := TENLink(Pointer(TWMNotify(Message).NMHdr)^);
if (p.Msg = WM_LBUTTONDOWN) then
begin
SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg)));
strURL := RichEdit1.SelText;
ShellExecute(Handle, 'open', PChar(strURL), 0, 0, SW_SHOWNORMAL);
end
end
end;

inherited;
end;

Теперь ваш редактор позволяет не только отображать ссылки но и переходить по ним.

Замечание!
При вызове ссылки работа приложения будет приостановлена пока не загрузится страница или не будет нажата кнопка "Стоп" в браузере.
И еще - не забудьте подгрузить модули ShellApi и RichEdit.

wellwell
Дата: 05.06.2009 06:03:52
Fly`

Че за фигня ? никак в толк не возьму. Киньте мысли, плиз, ато мозг сломается :-)


Я тоже недавно на эти грабли наступил. У тебя где-то COM инициализируется с флагом COINIT_MULTITHREADED. Хз по каким причинам, но ShellExecute завершается с ERROR_ACCESS_DENIED, если вызывающий поток был инициализирован таким образом. Простой тест:

var
 ErrCode: DWord;
begin
 CoInitializeEx(nil, COINIT_MULTITHREADED);
 ErrCode := ShellExecute(Handle, nil, 'http://www.ru', nil, nil, SW_SHOWDEFAULT);
 ShowMessage(IntToStr(ErrCode));
 CoUninitialize;
end;
Вернет код 5. Однако, такой вариант работает:
var
 ErrCode: DWord;
begin
 CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
 ErrCode := ShellExecute(Handle, nil, 'http://www.ru', nil, nil, SW_SHOWDEFAULT);
 ShowMessage(IntToStr(ErrCode));
 CoUninitialize;
end;

Почему - ХЗ, в документации ничего найти не удалось.
Fly`
Дата: 05.06.2009 13:46:34
wellwell, благодарю! Грабля именно в этом.