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

Вниз

перевод кода C   Найти похожие ветки 

 
Scott Storch ©   (2012-03-06 16:38) [0]


#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:11) [1]

Посмотри как это правильно сделано в модуле Windows.pas и не запиливай в свою прогу ужасающих костылей.


 
Scott Storch ©   (2012-03-06 17:33) [2]

в 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:39) [3]


> в windows.pas api-функция без суффикса A или W всегда ссылается
> на юникод-функцию

Это потому-что делфя теперь юникодовская и отката назад не будет. Коли имеется желание запилить код для винтажных версий, то надо

1. в Ansi версии использовать тип PAnsiChar
2. в Unicode — PWideChar
3. В функциях без суффикса — PChar.


 
Dimka Maslov ©   (2012-03-06 17:41) [4]

А вообще делфя это не загнивающие си. Тут такие фокусы не прокатывают. Либо юникод, либо не юникод и определяется это не директивами компиляции, а версией среды. И символа UNICODE может и не быть, а быть только символ, определяющий версию системы.



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.07 c
15-1327133819
Inovet
2012-01-21 12:16
2013.03.22
DrWeb 7.0 постоянное обращение к диску


15-1329862645
Дмитрий С
2012-02-22 02:17
2013.03.22
Спам


2-1338803238
rioko
2012-06-04 13:47
2013.03.22
Работа с нетипизированными файлами более 2 гигабайт


15-1333528430
Дмитрий С
2012-04-04 12:33
2013.03.22
SizeOf( ж );


15-1330664086
CleriC
2012-03-02 08:54
2013.03.22
HotKey в среде Delphi (не могу назначить)