一系列的TVarRec

时间:2015-04-28 10:09:15

标签: c++ arrays delphi wrapper

我想使用一个struct数组,就像delphi中的TVarRec数组一样。我的代码是:

int doProduct(TVarRec Handle[])
{
    cout<<Handle[0].VInteger<<endl;
    cout<<Handle[1].VInteger<<endl;
    cout<<sizeof(Handle); 
    return 0;
}

所以delphi给了我一个TVarRec的数组,我的主题是用c ++处理数组delphi,当我使用简单的数据时它可以工作,但是当我尝试使用复杂的数据如TVarRec它可能只识别第一个元素数组(Handle[0].VInteger<<endl;)和另一个等于0。

Delphi代码是一个使用C ++ Dll的控制台应用程序。 Delphi将为我的C ++ Dll充电并使用。

program Tx_ProduitCPP;

//To select a mode de compilation
{$IFDEF FPC}
{$mode objfpc}{$H+}
{$modeswitch objectivec1}
{$ENDIF}

uses
  FastSharemem,
  Windows,
  U_Small_Lib in 'U_Small_Lib.pas',
  System.SysUtils;

type
  TArr_VarRec=array of TVarRec;
  TdoProduct = function (AArr_Parameters:array of const):integer;cdecl;
  TLibHandle = System.THandle;

var
  ldoProduct:TdoProduct;
  lHandle:TLibHandle;
  lVarRecInput: TArr_VarRec;
  lVarRecOutput:TArr_VarRec;
  x:integer;
  test_int: array  of integer;
const
  NilHandle = TLibHandle(0);

begin
  //CALL A DLL C++
  lHandle := LoadLibrary('C:\Users\preparateur\Desktop\Delphi_and_CPP_Tests\Test_fin\dlls\test.dll');

  // VERIFIES IF IT EXISTS
  if lHandle <> NilHandle then
  begin
    @ldoProduct := Get_Dll_Function_Adress(lHandle, 'doProduct');
    if @ldoProduct <> nil then
    begin
      Setlength(lVarRecInput,10);
      lVarRecInput[0].VInteger:= 15;
      lVarRecInput[1].VInteger:= 10;

      //CALL THE FUNCTION DOPRODUCT
      ldoProduct(lVarRecInput);
      writeln(#13#10,'There are: ',sizeof(PChar),' parameters');
    end;
  end;
  sleep(1000);
end.

我制作了类似TVarRec的c ++结构,

struct TVarRec 
{
  int           VInteger;
  unsigned      VType;
  bool          VBoolean;
  char          VChar;
  long double*  VExtended;
  string *      VString;
  void*         VPointer;
  char*         VPChar;
  void*         VObject;
  void*         VClass;
  wchar_t       VWideChar;
  LPWSTR        VPWideChar;
  void*         VAnsiString;
  void*         VCurrency;
  void*         VVariant;
  void*         VInterface;
  void*         VWideString;
  uint64_t*     VInt64;
  void*         VUnicodeString;
};

0 个答案:

没有答案