2009-09-14 5 views
2

Я пишу DLL в Delphi с помощью ниже C++ пример:Преобразование функции C++ в Delphi: что делать с параметром void *?

USERDLL_API double process_message (const char* pmessage, const void* param) 
{ 
    if (pmessage==NULL) { return 0; } 
    if (param==NULL) { return 0; } 

    if (strcmp(pmessage,"state")==0) 
    { 
     current_state *state = (current_state*) param; 
     return process_state((current_state*)param); 
    } 
} 

К сожалению, я ничего не знаю о C++ и указателей. Что следует использовать вместо char * (PChar?) И void *?

function process_message (const pmessage: PChar; const param: ???): Double; export; 
begin 
    ??? 
end; 

exports process_message; 

Любая помощь с телом функции будет также высоко оценена. Я понимаю, что это не ракетостроение, но я бы не узнать основы C++ просто преобразовать пару строк, если кто-то достаточно любезен, чтобы сделать это для меня :-)

+3

Изучение основ C++ - это то, что вы должны делать * независимо от того, нужно ли вам переводить этот код. Если вы работаете с Delphi, то работаете в Windows, а если работаете в Windows, то вам следует знать, как читать C и C++, поскольку почти вся документация, которую вы увидите, находится на этих языках. Если вы этого не сделаете, вы просто торчаете головой в песок. –

+1

Хорошая точка, Роб. Просто я не профессиональный разработчик программного обеспечения. Я обычно делаю логику, и встроенные компоненты Delphi - это все, что мне нужно. Это был редкий случай, когда мне приходилось иметь дело с чем-то. Хвалите stackoverflow :-) – Mikhail

ответ

7
function process_message (const pmessage: PChar; const param: Pointer): Double; export; stdcall; 
begin 
    If (pmessage = nil) Or (param = nil) Then 
     Result := 0; 
    Else If StrComp(pmessage, 'state') = 0 Then 
     Result := process_state(current_state^(param)); 

    // missing a return statement for cases where pmessage is not 'state' here! 
end; 

exports process_message; 

проверялось, но должно помочь начните.

10

Онлайн-документация RAD Studio включает таблицу Delphi to C++ types mapping, которая может помочь вам перевести код C++ в Delphi.

Delphi type   Platform Corresponding C++ type 

Boolean (Delphi)    bool (C++) 
ShortInt (Delphi)    ShortInt, signed char (C++) 
SmallInt (Delphi)    short (C++) 
Integer (Delphi)    int (C++) 
Byte (Delphi)     Byte (C++) 
Word (Delphi)     Word (C++) 
Cardinal (Delphi)    unsigned (C++) 
Int64 (Delphi)     __int64 (C++) 
UInt64 (Delphi)     unsigned __int64 (C++) 
NativeInt (Delphi) 32-bit Win int (C++) 
        64-bit Win __int64 (C++) 
        64-bit iOS long (C++) 
NativeUInt (Delphi) 32-bit  unsigned (C++) 
        64-bit Win unsigned __int64 (C++) 
        64-bit iOS unsigned long (C++) 
Single (Delphi)     float (C++) 
Double (Delphi)     double (C++) 
Extended (Delphi)    Extended (C++) 
Currency (Delphi)    Currency, CurrencyBase (C++) 
Comp (Delphi)     Comp, CompBase (C++) 
Real (Delphi)     double (C++) 
ShortString (Delphi)   ShortString, ShortStringBase (C++) 
OpenString (Delphi)    OpenString (C++) 
File (Delphi)     file (C++) 
Text (Delphi)     TextFile (C++) 
ByteBool (Delphi)    ByteBool (C++) 
WordBool (Delphi)    WordBool (C++) 
LongBool (Delphi)    BOOL (C++) 
Real48 (Delphi)     not supported in C++ 
Pointer (Delphi)    void* (C++) 
PWideChar (Delphi)    WideChar* (C++) 
PAnsiChar (Delphi)    char* (C++) 
Variant (Delphi)    defined in sysvari.h (C++) 
OleVariant (Delphi)    defined in sysvari.h (C++) 
LongInt (Delphi)    int (C++) 
        64-bit iOS long (C++) 
LongWord (Delphi)    unsigned (C++) 
        64-bit iOS unsigned long (C++) 
FixedInt (Delphi)    int (C++) 
FixedUInt (Delphi)    unsigned int (C++) 
TextFile (Delphi)    TextFile (C++)