Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Байда с кодировками ANSI и Юникод

6
05 марта 2009 года
George
4.1K / / 05.01.2007
В общем имею переменную a: array[0..x] of WideChar;
есть функция, в которой надо указать указатель на array of AnsiChar, то бишь ей надо скормить PAnsiChar. Когда я делаю тупо PAnsiChar(a) - ругань, мол Invalid typecast. Чего прикажете делать? :)
1.9K
05 марта 2009 года
andriano
474 / / 10.01.2008
Преобразовать строку функцией WideCharToMultiByte.
6
05 марта 2009 года
George
4.1K / / 05.01.2007
мдя, вроде сделал. смотрите изврат, вдруг кому пригодится:
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]
3.7K
05 марта 2009 года
0nni
326 / / 24.06.2008
Я правильно задачу понял?
Код:
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.
6
05 марта 2009 года
George
4.1K / / 05.01.2007
хз, я уже запутался и забил до завтра. :)
240
05 марта 2009 года
aks
2.5K / / 14.07.2006
Короче Washington, у тебя тут вопиюще кривая работа с кодировками в том примере. Читай джаббер короче. Потом выложишь правильное решение. )
14
06 марта 2009 года
Phodopus
3.3K / / 19.06.2008
Кривой работы не вижу. Но можно вообще так:
Код:
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); //Проверим
240
06 марта 2009 года
aks
2.5K / / 14.07.2006
А я вижу. Особенно во втором примере. Мало того, что в обоих примерах используются соверненно не нужные перекодировки, так во втором они еще и совсем некорректны. Откуда вот там особенно попытка того, куда только что положили ucs-2 переписать новыми данными, а потом представить это как utf-8 =)
14
06 марта 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: aks
А я вижу. Особенно во втором примере.


А и правда там чего-то перемудрено :D

6
08 марта 2009 года
George
4.1K / / 05.01.2007
а то. Я делал по принципу- компилируется и ладно. :) впрочем от затеи мы отказались. Там из всей здоровенной библиотеки нужна одна маленькая фигня. :) но над задачкой подумаю. Если не будет совсем влом. :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог