program Project1;
{$APPTYPE CONSOLE}
procedure b( lpztData : [COLOR="Red"]PChar[/COLOR]);
begin
write(lpztData)
end;
var a: array[0..16] of [COLOR="red"]WideChar[/COLOR];
begin
FillChar(a, 16, $41);
b(@a);
ReadLn;
end.
Байда с кодировками ANSI и Юникод
есть функция, в которой надо указать указатель на array of AnsiChar, то бишь ей надо скормить PAnsiChar. Когда я делаю тупо PAnsiChar(a) - ругань, мол Invalid typecast. Чего прикажете делать? :)
Преобразовать строку функцией WideCharToMultiByte.
D7:
[highlight=delphi]
procedure CreateFileLink(const FileName, DisplayName: string; Folder: Integer);
var
ShellLink: IShellLink;
PersistFile: IPersistFile;
ItemIDList: PItemIDList;
FileDestPath: array[0..MAX_PATH] of Char;
FileNameW: array[0..MAX_PATH] of WideChar;
begin
CoInitialize(nil);
try
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_SERVER,
IID_IShellLinkA, ShellLink));
try
OleCheck(ShellLink.QueryInterface(IID_IPersistFile, PersistFile));
try
OleCheck(SHGetSpecialFolderLocation(0, Folder, ItemIDList));
SHGetPathFromIDList(ItemIDList, FileDestPath);
StrCat(FileDestPath, PChar('\' + DisplayName + LinkExt));
ShellLink.SetPath(PChar(FileName));
ShellLink.SetIconLocation(PChar(FileName), 0);
MultiByteToWideChar(CP_ACP, 0, FileDestPath, -1, FileNameW, MAX_PATH);
OleCheck(PersistFile.Save(FileNameW, True));
finally
{$IFDEF RX_D3}
PersistFile := nil;
{$ELSE}
PersistFile.Release;
{$ENDIF}
end;
finally
{$IFDEF RX_D3}
ShellLink := nil;
{$ELSE}
ShellLink.Release;
{$ENDIF}
end;
finally
CoUninitialize;
end;
end;
[/highlight]
D2009:
[highlight=delphi]
procedure CreateFileLink(const FileName, DisplayName: string; Folder: Integer);
var
ShellLink: IShellLink;
PersistFile: IPersistFile;
ItemIDList: PItemIDList;
FileDestPath: array[0..MAX_PATH] of AnsiChar;
TempPath: array[0..MAX_PATH] of Char;
FileNameW: array[0..MAX_PATH] of Char;
begin
CoInitialize(nil);
try
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_SERVER,
IID_IShellLinkA, ShellLink));
try
OleCheck(ShellLink.QueryInterface(IID_IPersistFile, PersistFile));
try
OleCheck(SHGetSpecialFolderLocation(0, Folder, ItemIDList));
MultiByteToWideChar(CP_ACP, 0, FileDestPath, -1, TempPath, MAX_PATH);
SHGetPathFromIDList(ItemIDList, TempPath);
WideCharToMultiByte(CP_UTF8, 0, TempPath, -1, FileDestPath, MAX_PATH, nil, nil);
StrCat(FileDestPath, PAnsiChar('\' + DisplayName + LinkExt));
ShellLink.SetPath(PChar(FileName));
ShellLink.SetIconLocation(PChar(FileName), 0);
MultiByteToWideChar(CP_ACP, 0, FileDestPath, -1, FileNameW, MAX_PATH);
OleCheck(PersistFile.Save(FileNameW, True));
finally
{$IFDEF RX_D3}
PersistFile := nil;
{$ELSE}
PersistFile.Release;
{$ENDIF}
end;
finally
{$IFDEF RX_D3}
ShellLink := nil;
{$ELSE}
ShellLink.Release;
{$ENDIF}
end;
finally
CoUninitialize;
end;
end;
[/highlight]
Я правильно задачу понял?
хз, я уже запутался и забил до завтра. :)
Короче Washington, у тебя тут вопиюще кривая работа с кодировками в том примере. Читай джаббер короче. Потом выложишь правильное решение. )
Код:
var
ItemIDList: PItemIDList;
FileDestPath: string;
W: WideString;
begin
OleCheck(SHGetSpecialFolderLocation(0, 11, ItemIDList));
SetLength(FileDestPath, MAX_PATH);
SHGetPathFromIDList(ItemIDList, PChar(FileDestPath));
SetLength(FileDestPath, StrLen(PChar(FileDestPath))); //когда-то была RealizeString...
[COLOR="Red"]CoTaskMemFree(ItemIDList);[/COLOR]
W := FileDestPath; //Вот и все преобразование. RTL сами с усами
MessageBoxW(Handle, PWideChar(W), '', 16); //Проверим
ItemIDList: PItemIDList;
FileDestPath: string;
W: WideString;
begin
OleCheck(SHGetSpecialFolderLocation(0, 11, ItemIDList));
SetLength(FileDestPath, MAX_PATH);
SHGetPathFromIDList(ItemIDList, PChar(FileDestPath));
SetLength(FileDestPath, StrLen(PChar(FileDestPath))); //когда-то была RealizeString...
[COLOR="Red"]CoTaskMemFree(ItemIDList);[/COLOR]
W := FileDestPath; //Вот и все преобразование. RTL сами с усами
MessageBoxW(Handle, PWideChar(W), '', 16); //Проверим
А я вижу. Особенно во втором примере. Мало того, что в обоих примерах используются соверненно не нужные перекодировки, так во втором они еще и совсем некорректны. Откуда вот там особенно попытка того, куда только что положили ucs-2 переписать новыми данными, а потом представить это как utf-8 =)
Цитата: aks
А я вижу. Особенно во втором примере.
А и правда там чего-то перемудрено :D
а то. Я делал по принципу- компилируется и ладно. :) впрочем от затеи мы отказались. Там из всей здоровенной библиотеки нужна одна маленькая фигня. :) но над задачкой подумаю. Если не будет совсем влом. :)