Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-23461
Ptr
2002-06-14 15:16
2002.07.08
IBQuery


4-23838
KiberArt
2002-05-09 10:24
2002.07.08
---|Ветка была без названия|---


8-23676
Lenidus
2002-02-27 23:28
2002.07.08
Как сделать полупрозрачным TPanel?


1-23567
DOG-ON-RUN
2002-06-27 02:09
2002.07.08
Есть задача - Помогите пожалуйста!


1-23607
Skier
2002-06-25 14:13
2002.07.08
А почему собственно ???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский