![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;