Передать строку в качестве аргумента из C # в функцию обратного вызова в C ++ - PullRequest
3 голосов
/ 18 декабря 2011

Я пишу оболочку C # dll, чтобы обернуть стороннюю C # dll. Мне также нужно представить это как методы Java, для которых я использую промежуточный уровень C ++, который оборачивает мою C # dll и предоставляет механизм JNI для предоставления того же самого с помощью java.

Однако у меня проблема с передачей строки в качестве аргумента функции обратного вызова, когда она вызывается в C ++. Вот код.

#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 #

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);
    }
}

Когда я сделал Console::WriteLine(strArg); в моей C ++ DLL, он просто печатает пустую строку! Буду очень признателен, если кто-нибудь сможет мне помочь, поскольку я довольно новичок во всем этом.

Спасибо, Дипак

1 Ответ

3 голосов
/ 18 декабря 2011

Наиболее вероятная проблема заключается в том, что C ++ ожидает строки ANSI, где C # создает Unicodes.

Так что если вы замените это

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

Вы можете проверить дополнительную информацию здесь: http://msdn.microsoft.com/en-us/library/s9ts558h

...