我有两种类型.一个类型A和一个类型B.问题类型A包含类型B,类型B包含类型A.这样的事情将不起作用:
type
typeA = record
test1 : typeB;
end;
type
typeB = record
test2 : typeA;
end;
Run Code Online (Sandbox Code Playgroud)
编辑: 那不是我的设计.我将包含此类构造的C头文件(访问DLL)转换为delphi.
Edit2: "C++结构是AFAIR类的另一个名称.并且必须有指针,而不是值本身. - Arioch'1分钟之前"是的你是对的,它是一个类型的指针:
我在那里定义:
test1 : ^typeB;
Run Code Online (Sandbox Code Playgroud)
这会改变吗?
test1 : Pointer;
Run Code Online (Sandbox Code Playgroud)
Edit3: C结构:
/* DLPDFPAGE */
typedef struct dlpdfpage
{
CosObj Page;
CosObj PrintSelect;
ASFixedRect PageBBox;
ASFixedRect ContentBBox;
struct dlpdfpage *Next;
PDRotate Angle;
struct dlpdfdoc *Doc;
DLPDFSTREAM *Content;
long PageNumber;
char Complete;
char FontSubstituted;
char FontMM;
char FontBad;
} DLPDFPAGE;
/* DLPDFDOC */
typedef struct dlpdfdoc
{
DLPDFINSTANCE *dliInstance;
PDDoc …Run Code Online (Sandbox Code Playgroud) 对于DLL的使用,我只有C头文件可用.现在我将这些头文件转换为Delphi接口文件.这很有效,直到出现像这样的复杂C Typedef:
typedef struct _IFSDK_PAUSE
{
int version;
FPDF_BOOL (*NeedToPauseNow) (struct _IFSDK_PAUSE* pThis);
void* user;
} IFSDK_PAUSE;
Run Code Online (Sandbox Code Playgroud)
转换为:
type
IFSDK_PAUSE = record
version: Integer;
pThis: <----- Problem!!!
user: Pointer;
end
Run Code Online (Sandbox Code Playgroud)
如何正确转换这些复杂的Typedef?
我想首先按x坐标排序坐标列表,然后按y坐标排序:
Orginal: (7,8)(10,22)(7,3)(5,10)(20,14)(7,10)(7,3)
First Step by x: (5,10)(7,8)(7,3)(7,10)(7,3)(10,22)(20,14)
Second Step by y: (5,10)(7,3)(7,3)(7,8)(7,10)(10,22)(20,14)
Run Code Online (Sandbox Code Playgroud)
我已经有一个适用于第一步的功能:
function SortCoords(Item1: Pointer; Item2: Pointer): Integer;
var
line1 : Coords;
line2 : Coords;
begin
line1 := Coords;(Item1);
line2 := Coords;(Item2);
if (line1.X < line2.X) then
result := -1
else if (line1.X > line2.X) then
result := 1
else
result := 0;
end;
Run Code Online (Sandbox Code Playgroud)
但我没有第二步.
我使用 C# DLL 导出(UnmanagedExports - https://www.nuget.org/packages/UnmanagementExports)使我的托管 C# DLL 可被非托管代码(如 Delphi)访问。我的问题是只有第一个函数参数从 delphi 传输到 C# dll:
C# DLL 部分
[DllExport("SomeCall", CallingConvention.StdCall)]
public static String SomeCall([MarshalAs(UnmanagedType.LPWStr)] String data1, [MarshalAs(UnmanagedType.LPWStr)] String data2)
{
//Data1 is never filled with some string data.
String result = WorkWithData(data1);
//Data2 is filled with some string data.
result += WorkWithData(data2)
return result;
}
Run Code Online (Sandbox Code Playgroud)
Delphi部分(调用部分):
SomeCall: function(data1: PWideChar; data2: PWideChar;): String StdCall;
procedure DoSomeDLLWork(data1: PWideChar; data2: PWideChar);
var
dllCallResult: String;
begin
dllCallResult := SomeCall(data1,data2);
end
Run Code Online (Sandbox Code Playgroud)
本例的问题是只填充了data2。data1 永远不会被填充。我已经尝试过 StdCall 和 …