からダイナミックアレイでデルファイDLLの使用:私は次のタイプが含まれているDelphiのDLLを有しているC#
type
TStepModeType = (smSingle, smMultiStep);
TParameter = record
Number: Integer;
end;
TStruct = record
ModType: PAnsiChar;
ModTypeRev: Integer;
ModTypeID: Integer;
RecipeName: PAnsiChar;
RecipeID: Double;
RootParamCount: Integer;
StepMode: TStepModeType;
ParamCount: Integer;
Parameters: array of TParameter;
end;
私はDLLは、意志Delphiのタイプに対応するRefオブジェクトを渡すC位からこのDLLを呼び出す必要塗りつぶして返します。私はこのような私のC#コードで構造体を定義している:
enum stepModeType
{
Single,
MultiStep
}
[StructLayout(LayoutKind.Sequential)]
struct parameter
{
public int Number;
}
[StructLayout(LayoutKind.Sequential)]
struct recipe
{
public string modType;
public int modTypeRev;
public int modTypeId;
public string recipeName;
public double recipeId;
public int rootParamCount;
public stepModeType stepMode;
public int paramCount;
public IntPtr parameters;
}
私は動的配列(パラメータ:たTParameterの配列)に走ったまで、私は大丈夫やっていたDelphiコードで。私は動的配列はDelphiのみの構造だと理解しています。そのため、配列へのポインタを取得してコンテンツを取得するために、C#コードでIntPtrを使用することを選択しました。残念ながら、私はこのinteropのものにはむしろ新しいです。私はIntPtrに対処する方法がわかりません。
たとえば、Delphi DLLは、2つのパラメータ項目を使用して動的配列を生成します。誰かが、Delphi DLLからC#呼び出しアプリケーションに戻ってくると、2つのパラメータ項目を配列から取得するC#コードを表示することはできますか?
更新:まあ、私が与えられたデルファイコードは、単純化されたバージョンでした。デルファイの開発者の一人は、ダイナミックアレイのダイナミックアレイのダイナミックアレイを含む実質的により複雑なリアルバージョンよりも簡単なバージョンを使い始める方が簡単だと考えていました。とにかく、私は今、完全に私の頭の上です。私は、デルファイが危険であると知っているだけです。以下は、Delphiコードの実際の構造体のコードです。私のC#アプリケーションからこれらの構造をどう扱うかについてのさらなるガイダンスは、非常に高く評価されます。ダイナミック配列がネストされていても、それは可能ではないかもしれません。
type
TStepModeType = (smSingle, smMultiStep);
TParamValue = record
strVal: String;
fVal: Double;
Changed: Boolean;
end;
TSteps = array of TParamValue;
TRule = record
Value: String;
TargetEnabled: Boolean;
end;
TParamInfo = record
Caption: String;
Units: String;
RuleCount: Integer;
Rules: array of TRule;
end;
TParameter = record
Info: TParamInfo;
Steps: TSteps;
end;
TStruct = record
ModType: PAnsiChar;
ModTypeRev: Integer;
ModTypeID: Integer;
RecipeName: PAnsiChar;
RecipeID: Double;
RootParamCount: Integer;
StepMode: TStepModeType;
ParamCount: Integer;
Parameters: array of TParameter;
end;
Delphi DLLに構造体のダイナミックメモリの割り当てを解除する関数が含まれていますか? –
それはありますが、あなたの答えで指摘されているように、私はメモリの問題を引き起こしてしまった文字列フィールドを間違って使用していました。 – meyousikmann