2009-03-25 7 views
2

C#の文字列をネイティブのC++ DLLの関数に送信します。ここでC#からC++に文字列を送信するInterop

は私のコードです: C#の方:

[DllImport(@"Native3DHandler.dll", EntryPoint = "#22", 
    CharSet = CharSet.Unicode)] 
private static extern void func1(byte[] path); 

public void func2(string path) 
{ 
    ASCIIEncoding encoding = new ASCIIEncoding(); 
    byte[] arr = encoding.GetBytes(path); 
    func1(this.something, arr); 
} 

C++側:

void func1(char *path) 
{ 
    //... 
} 

私はC++側で取得することは関係なく、どのような空の文字列、毎回、あります私は送る。 ヘルプ?

ありがとうございました。

+0

アルドより正確な渡しパラメーター定義のために、 [MarshalAs(UnmanagedType.LPStr)]などを使用してください。詳細はMSDNを参照してください – abatishchev

+0

C++側で文字列が空であると判断する方法は? – grieve

答えて

2

2つの問題があるようです。最初のネイティブC++はANSI文字列を使いますが、あなたはユニコードを指定しています。第2に、文字列を文字列としてマーシャリングするのが最も簡単です。

はあなたの宣言は間違っている、次の

[DllImport(
    @"Native3DHandler.dll", 
    EntryPoint = "#22", 
    CharSet = CharSet.Ansi)] 
private static extern void func1(void* something, [In] string path); 
0

にDLLIMPORTを変更してみてください。パラメータは文字列型である必要があり、あなたはそうのように、ANSIに文字セットエンコーディングを設定する必要があります。

[DllImport(@"Native3DHandler.dll", EntryPoint = "#22", 
    CharSet = CharSet.Ansi)] 
private static extern void func1(string path); 

これはあなたのC++コードでパス変数の内容を変更していないことを前提としています。次に、文字列パラメータを直接渡します(ラッパーは必要ありません)。

0

文字列を送信するだけの場合は、func1のパラメータを文字列として宣言してください。文字列を受け取る場合は、StringBuilderとして宣言し、受け取るバッファ領域を十分に確保します。

2

をマーシャリングデフォルトVS2008で余分なマーシャリングの指示に私の作品罰金:

C#の方:

[DllImport("Test.dll")] 
public static extern void getString(StringBuilder theString, int bufferSize); 

func() 
{ 
    StringBuilder tstStr = new StringBuilder(BufSize); 
    getString(tstStr, BufSize); 
} 

C++側:

extern "C" __declspec(dllexport) void getString(char* str, int bufferSize) 
{ 
    strcpy_s(str, bufferSize, "FOOBAR"); 
} 
関連する問題