Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.06.2014, 09:10
otan otan вне форума
Прохожий
 
Регистрация: 11.06.2014
Сообщения: 5
Версия Delphi: RAD Studio XE5
Репутация: 10
По умолчанию ShellExecute и ошибка на NativeUInt

Люди добрые! Подскажите!
Пишу вот такой вот код.

Код:
ShellExecute(0, nil,'http://9kumalak.kz',nil,nil,1);
Так тоже пробовал

Код:
ShellExecute((Application.Handle,PChar('open'), PChar('9kumalak.kz'), PChar(0), nil, SW_NORMAL) ;
Почему-то при выполнении обоих случаев выдает следующую ошибку

Код:
[dcc32 Error] Unit1.pas(1026): E2014 Statement expected, but expression of type 'NativeUInt' found
Не могу понять на что он ругается? Вроде бы я синтаксис функции правильно написал.
Ответить с цитированием
  #2  
Старый 11.06.2014, 09:27
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от otan
Люди добрые! Подскажите!
Пишу вот такой вот код.

Код:
ShellExecute(0, nil,'http://9kumalak.kz',nil,nil,1);
Этот код у меня в Delphi 7 и Delphi XE2 отработал как положено и без ошибок.
Цитата:
Сообщение от otan
Так тоже пробовал

Код:
ShellExecute((Application.Handle,PChar('open'), PChar('9kumalak.kz'), PChar(0), nil, SW_NORMAL) ;
Если убрать лишнюю открывающую скобку и добавить 'http://' к адресу, то этот вариант у меня тоже работает аналогично первому.
Цитата:
Сообщение от otan
Почему-то при выполнении обоих случаев выдает следующую ошибку
Наверное всё же при компиляции, а не при выполнении. При выполнении компилятор никаких ошибок выдавать уже не может.
Цитата:
Сообщение от otan
Код:
[dcc32 Error] Unit1.pas(1026): E2014 Statement expected, but expression of type 'NativeUInt' found
Не могу понять на что он ругается? Вроде бы я синтаксис функции правильно написал.
Delphi XE5 "под рукой" нет - проверить не могу, но всё же сомневаюсь, что компилятор жалуется именно на эту строчку. Попробуй создать новый, пустой проект и в нём потестировать эту команду.
Ответить с цитированием
  #3  
Старый 11.06.2014, 09:59
otan otan вне форума
Прохожий
 
Регистрация: 11.06.2014
Сообщения: 5
Версия Delphi: RAD Studio XE5
Репутация: 10
По умолчанию

Создал проект по новому и написал тот же код. И все нормально стало работать.
А с существующим проектом выдает все ту же ошибку. Непонятно из за чего.
Как теперь быть?
В существующем проекте используются следующие элементы.
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, StdCtrls, Vcl.ExtCtrls, Vcl.MPlayer, Vcl.Buttons, Vcl.Imaging.jpeg,Math,ShellApi,GIFImg;
Ответить с цитированием
  #4  
Старый 11.06.2014, 10:13
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от otan
Создал проект по новому и написал тот же код. И все нормально стало работать.
А с существующим проектом выдает все ту же ошибку. Непонятно из за чего.
Как теперь быть?
Скорее всего не на тот ShellExecute идёт ссылка. Попробуй удерживая клавишу Ctrl щёлкнуть по ShellExecute - должен открыться стандартный модуль "Winapi.ShellAPI". Посмотри попутно как объявлены параметры у этой функции.
Цитата:
Сообщение от otan
В существующем проекте используются следующие элементы.
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, StdCtrls, Vcl.ExtCtrls, Vcl.MPlayer, Vcl.Buttons, Vcl.Imaging.jpeg,Math,ShellApi,GIFImg;
Попробуй "ShellApi" прописать в самом конце и с полным именем: "Winapi.ShellAPI".
Ответить с цитированием
  #5  
Старый 11.06.2014, 10:43
otan otan вне форума
Прохожий
 
Регистрация: 11.06.2014
Сообщения: 5
Версия Delphi: RAD Studio XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Скорее всего не на тот ShellExecute идёт ссылка. Попробуй удерживая клавишу Ctrl щёлкнуть по ShellExecute - должен открыться стандартный модуль "Winapi.ShellAPI". Посмотри попутно как объявлены параметры у этой функции.Попробуй "ShellApi" прописать в самом конце и с полным именем: "Winapi.ShellAPI".

Объявлены они вот так вот
{$EXTERNALSYM ShellExecute}
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
Directory: LPWSTR; ShowCmd: Integer): HINST; stdcall;

Цитата:
Сообщение от poli-smen
Скорее всего не на тот ShellExecute идёт ссылка. Попробуй удерживая клавишу Ctrl щёлкнуть по ShellExecute - должен открыться стандартный модуль "Winapi.ShellAPI". Посмотри попутно как объявлены параметры у этой функции.Попробуй "ShellApi" прописать в самом конце и с полным именем: "Winapi.ShellAPI".

Прописал. Не получилось.

А это случайно не может быть связано с разрядностью операционной системы?

Последний раз редактировалось otan, 11.06.2014 в 10:50.
Ответить с цитированием
  #6  
Старый 11.06.2014, 13:00
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от otan
Объявлены они вот так вот
{$EXTERNALSYM ShellExecute}
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
Directory: LPWSTR; ShowCmd: Integer): HINST; stdcall;
В Delphi XE2 вместо "LPWSTR" прописано "PWideChar", но вряд-ли с этим связано.
Цитата:
Сообщение от otan
А это случайно не может быть связано с разрядностью операционной системы?
Откомпилировал у себя в Delphi XE2 под 64 бита - нормально работает.

Если закомментировать вызов ShellExecute то точно никаких ошибок компилятор не выдаёт?

Ещё как вариант, можешь прописать объявление ShellExecute в своём модуле прямо перед процедурой где она используется вот так:
Код:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
  Directory: LPWSTR; ShowCmd: Integer): HINST; stdcall;
  external 'shell32.dll' name 'ShellExecuteW';
или так:
Код:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
  Directory: PWideChar; ShowCmd: Integer): HINST; stdcall;
  external 'shell32.dll' name 'ShellExecuteW';
или даже так:
Код:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
  Directory: WideString; ShowCmd: Integer): HINST; stdcall;
  external 'shell32.dll' name 'ShellExecuteW';
при этом не нужно приводить строковые параметры к типу PChar.
Ответить с цитированием
  #7  
Старый 11.06.2014, 15:10
otan otan вне форума
Прохожий
 
Регистрация: 11.06.2014
Сообщения: 5
Версия Delphi: RAD Studio XE5
Репутация: 10
По умолчанию

Спасибо за отклики, Полицай!
Но, я нашел уже решение.
Оказалась что у меня в проекте отключена опция Extended Syntax.
Ошибка выходило из за этого. Компилятор не понимал, что такое shellexecute.
Включил опцию и все нормально стало.
Ответить с цитированием
  #8  
Старый 11.06.2014, 16:12
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от otan
Спасибо за отклики, Полицай!
Но, я нашел уже решение.
Оказалась что у меня в проекте отключена опция Extended Syntax.
Ошибка выходило из за этого. Компилятор не понимал, что такое shellexecute.
Включил опцию и все нормально стало.
Действительно. Даже в Delphi 7 отключение этой опции вызывает ошибку компиляции.

Но если присваивать куда-нибудь результат выполнения функции:
Код:
var
  dw: DWORD;
begin
  dw := ShellExecute(Application.Handle,PChar('open'), PChar('http://9kumalak.kz'), PChar(0), nil, SW_NORMAL) ;
end;
то работает даже при отключенной опции "Extended syntax"

p.s. Кстати посмотрел в интернете что такое "Тогызкумалак", прикольно, помню я в детстве увлекался игрой Калах.
Ответить с цитированием
  #9  
Старый 11.06.2014, 21:00
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от otan
Компилятор не понимал, что такое shellexecute.
Нет! При отключеннии расширенного синтаксиса не работает арифметика строковых указателей, и конструкция PChar(0) стала невалидной. Ошибся.
__________________
Не стоит путать форумы с богадельнями. © Bargest

Последний раз редактировалось Freeman, 11.06.2014 в 21:02.
Ответить с цитированием
  #10  
Старый 13.06.2014, 20:52
otan otan вне форума
Прохожий
 
Регистрация: 11.06.2014
Сообщения: 5
Версия Delphi: RAD Studio XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
p.s. Кстати посмотрел в интернете что такое "Тогызкумалак", прикольно, помню я в детстве увлекался игрой Калах.
Когда закончу проект, дам знать. Оцените мой труд на дельфи.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter