Главная страница
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.083 c
2-1333345551
TSubject
2012-04-02 09:45
2013.03.22
Вопрос по выпадающему списку


15-1340305869
Ega23
2012-06-21 23:11
2013.03.22
Знатокам Оракла и вообще.


4-1258127067
harisma
2009-11-13 18:44
2013.03.22
Major/Minor OS Version


15-1349867018
stas
2012-10-10 15:03
2013.03.22
Изменить charset


15-1351150942
delphist
2012-10-25 11:42
2013.03.22
Delphi-форумы