Главная страница
    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.06 c
15-1339144160
xayam
2012-06-08 12:29
2013.03.22
Визуальное программирование


2-1335432052
Pcrepair
2012-04-26 13:20
2013.03.22
Многопользовательский режим работы проги


1-1297432020
sniknik
2011-02-11 16:47
2013.03.22
В корзину из сервиса...


15-1341001802
Юрий
2012-06-30 00:30
2013.03.22
С днем рождения ! 30 июня 2012 суббота


15-1342284725
ПЛОВ
2012-07-14 20:52
2013.03.22
Некорректная работа StringReplace, или я туплю?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский