Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

перевод кода 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.063 c
15-1349382603
Юрий
2012-10-05 00:30
2013.03.22
С днем рождения ! 5 октября 2012 пятница


15-1345901388
Фокс Йожин
2012-08-25 17:29
2013.03.22
Картина


2-1330616538
>|<
2012-03-01 19:42
2013.03.22
Ошибка перемещения файла


15-1330245287
stas
2012-02-26 12:34
2013.03.22
Помогите настроить роутер микротик


15-1346349689
alexdn
2012-08-30 22:01
2013.03.22
Теория чисел





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский