Форум: "WinAPI";
Текущий архив: 2002.07.08;
Скачать: [xml.tar.bz2];
ВнизPWideChar Найти похожие ветки
← →
Nickolay (2002-05-07 16:31) [0]Подскажите в чем проблема?
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 ..."
← →
troits (2002-05-07 17:01) [1]Попробуй вместо
Name: string;
Name: WideString;
← →
Digitman (2002-05-07 17:12) [2]Как минимум, явное преобразование типа PWideChar(Name), где Name: string, работает не так , как ты предполагаешь. В результате исполнения такой конструкции будет сформирована лишь ссылка на строковый буфер, содержание которого как было типа AnsiString, так и осталось, т.е. компилятор совершенно не заботится в дан.случае о преобразовании Ansi-контекста в Unicode-контекст.
Второе. Я не проверял PAS-прототип, но, согласно MSDN, IconIndex однозначно должен передаваться по ссылке, а не по значению. Уточни PAS-прототип, возможно, следует писать @IconIndex вместо просто IconIndex.
← →
troits (2002-05-07 17:22) [3]Var - ом она передается.
← →
troits (2002-05-07 17:24) [4]Да и не скомпилировалось бы иначе.
← →
Digitman (2002-05-07 17:32) [5]Ну, тогда остается только одно - несоответствие формально ожижаемой Unicode-строки фактически передаваемой Ansi-строке
← →
Song (2002-05-07 21:33) [6]Image1.Picture.Icon := Icon;
Это я так понимаю вставлено, чтобы вывести иконку на экран. Меньше проблем будет, если будете рисовать через DrawIcon() - вывод на экран всего одной строкой за место всей Вашей процедуры.
← →
Cobalt (2002-05-08 09:46) [7]Попробуйте назвать
Name
по другому, чтоб не перепутать с именем формы.
← →
Дмитрий Баранов (2002-05-08 10:46) [8]Почему ExtractAssociatedIconW? Есть просто ExtractAssociatedIcon, если пишешь не для китайцев - большего и не надо.
Если нужна все-таки W -
см. WideCharToMultiByte и MultiByteToWideChar.
← →
Nickolay (2002-05-08 11:09) [9]ExtractAssociatedIconW потому что под win2k, если без W то тогда ничего не возвращается в h. IconIndex передается var- ом, это точно. В том то и весь прикол, что если я вместо Name вставляю стринговое значение (прямо в ExtractAssociatedIconW) то все работает как надо.
← →
Song (2002-05-08 11:12) [10]>>если без W то тогда ничего не возвращается
Ерунда..
← →
Nickolay (2002-05-08 11:18) [11]Всем большое спасибо за помощь.
Вот так все работает:
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 подходит.
← →
Nickolay (2002-05-08 11:21) [12]to Song
в принципе возвращается... это h=0.
← →
Дмитрий Баранов (2002-05-08 11:35) [13]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 12:18) [14]Еще раз спасибо, так у меня не получалось. Теперь и так есть.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.07.08;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c