カスタムCOMインターフェイス用の.netラッパーを作成しようとしています。マーシャリングChar *。すべての文字を取得する方法
インタフェースがC++で、次のように定義されています
DECLARE_INTERFACE_(IDumpAsf, IUnknown)
{
STDMETHOD(get_UserParams) (THIS_
int *is_auto_start,
int *fileSize,
int *packetSize,
char *baseName,
char *filePath
) PURE;
STDMETHOD(set_UserParams) (THIS_
int is_auto_start,
int fileSize,
int packetSize,
char *baseName,
char *filePath
) PURE;
STDMETHOD(enable_Run) (THIS_
bool is_run
) PURE;
};
そして、私はC#で、このようなインターフェースを宣言している:
public interface IDumpASF
{
[PreserveSig]
int get_UserParams(
[Out] out int is_auto_start,
[Out] out int fileSize,
[Out] out int packetSize,
[Out] out System.Sbyte baseName,
[Out] out System.SByte filePath
);
[PreserveSig]
int set_UserParams(
[In] int is_auto_start,
[In] int fileSize,
[In] int packetSize,
[In] string baseName,
[In] string filePath
);
[PreserveSig]
int enable_Run([In] bool a);
}
使用のexsampleはこれです:
int is_auto_start;
int fileSize;
int packetSize;
SByte baseName;
SByte filePath;
IDumpASF dump = (IDumpASF)asfWriter;
dump.get_UserParams(out is_auto_start, out fileSize, out packetSize, out baseName, out filePath);
私は魂を構築して実行することができますが、私はどのようにすべての文字を取得すると思いますかbaseNameおよびfilePath SByteを送ると、最初のキャラクターが戻ってきますが、残りはどうすればいいですか?私はSbyte []、String、StringBuilder、IntPtrのようないくつかのタイプを試しました。文字列に変換しようとするたびに、私はAccessViolationExceptionを取得します。
私が逃したばかげたことがあると思うが、私の患者はここで薄くなっている。
どのようなヘルプが多くのappriciatedでしょう!
-Svein
こんにちはハンス。説明したように、私はこれにStringBuilderを使用することができます。私もSByteの配列でテストを行いました.MarshalAs(UnmanagedType.LPArray)を使用するとうまくいきます。何が奨励されているかに関する提案はありますか? – Svein
@Svein、StringBuilderは標準的な方法です。 Encoding.Default.GetString()を使用してbyte []から文字列に変換する必要がなくなります。 –
Ok。私はStringBuilderに行くでしょう。ありがとう。 – Svein