Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.08;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2002.07.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.019 c
7-23821
Chief
2002-04-13 17:20
2002.07.08
Чтение данных с устройства под Windows 2000


3-23507
Sava
2002-06-17 15:44
2002.07.08
Как вернуть значение из хранимой процедуры MS SQL?


1-23662
Cosinus
2002-06-26 11:11
2002.07.08
Подскажите, как понять, какая именно клавиша нажата на мыши?


1-23604
boger
2002-06-25 11:27
2002.07.08
как записать в файл переменную нестандартную переменную?


1-23668
cher_gvf
2002-06-26 13:12
2002.07.08
Как узнать код ошибки EInOutError ?