![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перевод кода C
Scott Storch © (2012-03-06 16:38:00)
#ifdef UNICODE
#define CreatePatchFile CreatePatchFileW
#define ApplyPatchToFile ApplyPatchToFileW
#else
#define CreatePatchFile CreatePatchFileA
#define ApplyPatchToFile ApplyPatchToFileA
#endif // UNICODE
Тут константам-функциям присваивается функция. Нужно это корректно перевести на Delphi:
Вот что я набросал, насколько это правильно?
{$IFDEF UNICODE}
TCreatePatchFile = function (OldFileName: LPCWSTR; NewFileName: LPCWSTR;
PatchFileName: LPCWSTR; OptionFlags: ULONG;
OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
{$ELSE}
TCreatePatchFile = function (OldFileName: LPCTSTR; NewFileName: LPCTSTR;
PatchFileName: LPCTSTR; OptionFlags: ULONG;
OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
{$ENDIF}
function CreatePatchFileA(OldFileName: LPCTSTR; NewFileName: LPCTSTR;
PatchFileName: LPCTSTR; OptionFlags: ULONG;
OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
function CreatePatchFileW(OldFileName: LPCWSTR; NewFileName: LPCWSTR;
PatchFileName: LPCWSTR; OptionFlags: ULONG;
OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
function ApplyPatchToFileA(PatchFileName: LPCTSTR; OldFileName: LPCTSTR;
NewFileName: LPCTSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
function ApplyPatchToFileW(PatchFileName: LPCWSTR; OldFileName: LPCWSTR;
NewFileName: LPCWSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
implementation
const
mspatcha = 'mspatcha.dll';
mspatchc = 'mspatchc.dll';
function CreatePatchFileA; external mspatchc name 'CreatePatchFileA';
function CreatePatchFileW; external mspatchc name 'CreatePatchFileW';
function ApplyPatchToFileA; external mspatcha name 'ApplyPatchToFileA';
function ApplyPatchToFileW; external mspatcha name 'ApplyPatchToFileW';
const
{$IFDEF UNICODE}
CreatePatchFile: TCreatePatchFile = CreatePatchFileW;
{$ELSE}
CreatePatchFile: TCreatePatchFile = CreatePatchFileA;
{$ENDIF}
end.
Dimka Maslov (2012-03-06 17:41:00) [1]А вообще делфя это не загнивающие си. Тут такие фокусы не прокатывают. Либо юникод, либо не юникод и определяется это не директивами компиляции, а версией среды. И символа UNICODE может и не быть, а быть только символ, определяющий версию системы.
Dimka Maslov (2012-03-06 17:39:00) [2]
> в windows.pas api-функция без суффикса A или W всегда ссылается
> на юникод-функцию
Это потому-что делфя теперь юникодовская и отката назад не будет. Коли имеется желание запилить код для винтажных версий, то надо
1. в Ansi версии использовать тип PAnsiChar
2. в Unicode — PWideChar
3. В функциях без суффикса — PChar.
Scott Storch (2012-03-06 17:33:00) [3]в windows.pas api-функция без суффикса A или W всегда ссылается на юникод-функцию. В С определяется директивой компилятора UNICODE. Нужно сделать так, что если проект delphi собирается с директивой UNICODE, функция CreatePatchFile должна ссылаться на CreatePatchFileW иначе на CreatePatchFileA. Могу конечно сделать так:
function CreatePatchFileA(OldFileName: LPCTSTR; NewFileName: LPCTSTR;
PatchFileName: LPCTSTR; OptionFlags: ULONG;
OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
function CreatePatchFileW(OldFileName: LPCWSTR; NewFileName: LPCWSTR;
PatchFileName: LPCWSTR; OptionFlags: ULONG;
OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
{$IFDEF UNICODE}
function CreatePatchFile(OldFileName: LPCWSTR; NewFileName: LPCWSTR;
PatchFileName: LPCWSTR; OptionFlags: ULONG;
OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
{$ELSE}
function CreatePatchFile(OldFileName: LPCTSTR; NewFileName: LPCTSTR;
PatchFileName: LPCTSTR; OptionFlags: ULONG;
OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
{$ENDIF}
{$IFDEF UNICODE}
function CreatePatchFile; external mspatchc name 'CreatePatchFileW';
{$ELSE}
function CreatePatchFile; external mspatchc name 'CreatePatchFileA';
{$ENDIF}
но может есть более красивый вариант, вот и спрашиваю.
Dimka Maslov (2012-03-06 17:11:00) [4]Посмотри как это правильно сделано в модуле Windows.pas и не запиливай в свою прогу ужасающих костылей.