Search code examples
c++delphidllimport

DLL C++ import functions to Delphi


How do I access the functions of a C++ DLL in Delphi

 #define CCONV _stdcall 
  typedef struct{ 
    unsigned long BaudRate; 
    unsigned char PortNumber; 
    ..... 
  }SSP_COMMAND;

NOMANGLE int CCONV OpenSSPComPort (SSP_COMMAND * cmd);

In documentation: OpenSSPComPort

Parameters: Pointer to SSP_COMMAND structure

Returns: WORD 0 for fail, 1 for success

I suspect I am wrong about this Pointer.

In Delphi I am attempting this:

type
  SSP_COMMAND=class
   BaudRate:integer;
   PortNumber:integer;
end;

type
 TOpenSSPComPort = function (sspc:SSP_COMMAND):Integer;stdcall;

    var nv11 : THandle;
    OpenSSPComPort:TOpenSSPComPort;

    procedure TForm1.FormCreate(Sender: TObject);
    begin

    if nv11 = 0 then
    begin
      nv11 := LoadLibrary(pchar('ITLSSPProc.dll'));
      @OpenSSPComPort:=GetProcAddress(nv11, 'OpenSSPComPort');

      ss_cmd := SSP_COMMAND.create;

    end;
  end;

  procedure TForm1.Button1Click(Sender: TObject);
  begin
    ss_cmd.BaudRate := 9600;
    ss_cmd.PortNumber :=8;

   If OpenSSPComPort(ss_cmd)=0 Then
   Memo1.lines.add('Error OpenSSPComPort')
   else
   Memo1.lines.add('OpenSSPComPort - OK');

  end;

So result is : COM0 - Can't open this port but I sent 8 this means then SSP_COMMAND was sent incorrectly


Solution

  • According to the C definition from the link you provided, you would need to change the following:

    type
      SSP_FULL_KEY = packed record
        FixedKey : UINT64;
        EncryptKey : UINT64;
    end;  
    
    type
      SSP_COMMAND=packed record
        key : SSP_FULL_KEY;
        BaudRate:integer;
        PortNumber:integer;
        SSPAddress : byte;
        RetryLevel : byte; 
        EncryptionStatus : byte;
        CommandDataLength : byte;
        CommandData : Array[0..254] of byte;
        ResponseStatus : byte;
        ResponseDataLength : byte;
        ResponseData : Array[0..254] of byte;
      end;
      PSSP_COMMAND = ^SSP_COMMAND;
    
    type
      TOpenSSPComPort = function (sspc:PSSP_COMMAND):Integer;stdcall;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ss_cmd : SSP_COMMAND; 
    begin 
      FillChar(ss_cmd, sizeof(ss_cmd), 0);
      ss_cmd.BaudRate := 9600;
      ss_cmd.PortNumber :=8;
    
      If OpenSSPComPort(@ss_cmd)=0 Then
        Memo1.lines.add('Error OpenSSPComPort')
      else
        Memo1.lines.add('OpenSSPComPort - OK');
    end;