Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

PWideChar [D5, Win2k]


Nickolay ©   (2002-05-07 16:31:00) 

Подскажите в чем проблема?
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
IconIndex : word;
h : hIcon;
Name : string;
ExtPos : Integer;
Icon : TIcon;
begin
Name := "C:\PROGRA~1\DAP\DAP.EXE";
IconIndex := 129;
h:=ExtractAssociatedIconW(hInstance,PWideChar(Name),IconIndex);
Icon := TIcon.Create;
Icon.Handle := h;
Image1.Picture.Icon := Icon;
Icon.Free;
end;
В результате в конце выполнения этого блока, делфи ругается "Access violation at address ..."


Nickolay   (2002-05-08 12:18:00) [1]

Еще раз спасибо, так у меня не получалось. Теперь и так есть.


Дмитрий Баранов   (2002-05-08 11:35:00) [2]

procedure TForm1.Button1Click(Sender: TObject);
var P: array[0..MAX_PATH] of WideChar;
D: PWideChar;
Z: string;
H: HIcon;
Icon: TIcon;
var Dummy: Word;
begin
Z:="W:\0506-spisok.doc";
D:=StringToWideChar(Z, @P, MAX_PATH);
Icon:=TIcon.Create;
Icon.Handle:=ExtractAssociatedIconW(HInstance, D, Dummy);
self.Icon:=Icon;
end;

end.


Nickolay   (2002-05-08 11:21:00) [3]

to Song
в принципе возвращается... это h=0.


Nickolay   (2002-05-08 11:18:00) [4]

Всем большое спасибо за помощь.
Вот так все работает:
var
IconIndex : word;
h : hIcon;
Name : WideString;
ExtPos : Integer;
Icon : TIcon;
begin
Name := "C:\PROGRA~1\DAP\DAP.EXE";
IconIndex := 129;
h:=ExtractAssociatedIconW(hInstance,PWideChar(Name),IconIndex);
Icon := TIcon.Create;
Icon.Handle := h;
Image1.Picture.Icon := Icon;
Icon.Free;
end;

Это для Win2k подходит.


Song   (2002-05-08 11:12:00) [5]

>>если без W то тогда ничего не возвращается
Ерунда..


Nickolay   (2002-05-08 11:09:00) [6]

ExtractAssociatedIconW потому что под win2k, если без W то тогда ничего не возвращается в h. IconIndex передается var- ом, это точно. В том то и весь прикол, что если я вместо Name вставляю стринговое значение (прямо в ExtractAssociatedIconW) то все работает как надо.


Дмитрий Баранов   (2002-05-08 10:46:00) [7]

Почему ExtractAssociatedIconW? Есть просто ExtractAssociatedIcon, если пишешь не для китайцев - большего и не надо.
Если нужна все-таки W -
см. WideCharToMultiByte и MultiByteToWideChar.


Cobalt   (2002-05-08 09:46:00) [8]

Попробуйте назвать Nameпо другому, чтоб не перепутать с именем формы.


Song   (2002-05-07 21:33:00) [9]

Image1.Picture.Icon := Icon;
Это я так понимаю вставлено, чтобы вывести иконку на экран. Меньше проблем будет, если будете рисовать через DrawIcon() - вывод на экран всего одной строкой за место всей Вашей процедуры.


Digitman   (2002-05-07 17:32:00) [10]

Ну, тогда остается только одно - несоответствие формально ожижаемой Unicode-строки фактически передаваемой Ansi-строке


troits   (2002-05-07 17:24:00) [11]

Да и не скомпилировалось бы иначе.


troits   (2002-05-07 17:22:00) [12]

Var - ом она передается.


Digitman   (2002-05-07 17:12:00) [13]

Как минимум, явное преобразование типа PWideChar(Name), где Name: string, работает не так , как ты предполагаешь. В результате исполнения такой конструкции будет сформирована лишь ссылка на строковый буфер, содержание которого как было типа AnsiString, так и осталось, т.е. компилятор совершенно не заботится в дан.случае о преобразовании Ansi-контекста в Unicode-контекст.

Второе. Я не проверял PAS-прототип, но, согласно MSDN, IconIndex однозначно должен передаваться по ссылке, а не по значению. Уточни PAS-прототип, возможно, следует писать @IconIndex вместо просто IconIndex.


troits   (2002-05-07 17:01:00) [14]

Попробуй вместо
Name: string;

Name: WideString;


Наверх

Титульная страница Поиск, карта сайта Написать письмо