我想使用一个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;
};