2011-12-18 38 views
3

C#DLLをラップするためにC#dllラッパーを作成しています。 また、私はC#dllをラップする中間C++層を使用しているJavaメソッドとしてこれを公開し、JNIメカニズムを使用してjavaを使用して公開しています。C#の文字列をC++のコールバック関数に渡します。

しかし、C++で呼び出されたときにstringを引数として渡す際にコールバック関数に問題があります。ここにコードがあります。ここで

#include "stdafx.h" 
#include "JavaInclude.h" 
#include <iostream> 
#using "Class1.netmodule" 
#using <mscorlib.dll> 

using namespace std; 
using namespace System; 

int CSomeClass::MemberFunction(void* someParam) 
{ 
    cout<<"Yaay! Callback"<<endl; 
    return 0; 
} 

static int __clrcall SomeFunction(void* someObject, void* someParam, String^ strArg) 
{ 
    CSomeClass* o = (CSomeClass*)someObject; 
    Console::WriteLine(strArg); 
    return o->MemberFunction(someParam); 
} 

JNIEXPORT void JNICALL Java_de_tum_kinect_KinectSpeechInit_initConfig 
    (JNIEnv *env, jobject obj) 
{ 
    array<String^>^ strarray = gcnew array<String^>(5); 
    for(int i=0; i<5; i++) 
      strarray[i] = String::Concat("Number ",i.ToString()); 

    CSomeClass o; 
    void* p = 0; 
    CSharp::Function(System::IntPtr(SomeFunction), System::IntPtr(&o), System::IntPtr(p), strarray); 
} 

は、私のC#クラスは、私は私のC++のdllでConsole::WriteLine(strArg);をしたときは、それだけで、空白文字列を出力

using System; 
using System.Runtime.InteropServices; 

public class CSharp 
{ 
    delegate int CFuncDelegate(IntPtr Obj, IntPtr Arg, string strArg); 

    public static void Function(IntPtr CFunc, IntPtr Obj, IntPtr Arg, String[] pUnmanagedStringArray) 
    { 
     CFuncDelegate func = (CFuncDelegate)Marshal.GetDelegateForFunctionPointer(CFunc, typeof(CFuncDelegate)); 

     for (int i = 0; i < pUnmanagedStringArray.Length; i++) 
     { 
      Console.WriteLine(pUnmanagedStringArray[i]); 
     } 
     string strArg = "Test String"; 
     int rc = func(Obj, Arg, strArg); 
    } 
} 

です! 誰も私を助けることができたら本当に感謝します。

おかげで、 ディーパック

答えて

3

は、最も可能性の高い問題は、C++は、C#ユニコードのものを作成するようANSI文字列を期待していることです。 http://msdn.microsoft.com/en-us/library/s9ts558h

+0

まあ:

だからあなたはあなたがここでより多くの情報をチェックアウトすることができ、この

delegate int CFuncDelegate(IntPtr Obj, IntPtr Arg, [MarshalAs (UnmanagedType.LPSTR)] string strArg); 

と交換した場合。これはうまくいった!ありがとうございました! – deepak

関連する問題