1

マネージド コードとアンマネージド コードの間で文字列を渡す際に、多くの問題に直面しています。コードを検索して組み合わせた後、うまくいくように見える解決策があります。しかし、それが正しい実装かどうかはまだわかりません。

私のコードでは、c# はデリゲート関数を c++ に渡します。現在、c++ は必要に応じてその関数を呼び出します。C++ は、BSTR を使用している関数をコールバックするために文字列を送信する必要があります。それが私がそれを実装した方法です。

C#

[DllImport("xyz.dll")]
public static extern void SetCallback(Callback fn);

public delegate void Callback([MarshalAs(UnmanagedType.BStr)]string str);
public Callback mInstance;

private void Handler(string text)
{
  NotifyListeners_uccx(text);
}

Private void setcallback(){
 mInstance = new Callback(Handler);
 SetCallback(mInstance);  }

C++

typedef void (__stdcall *Callback) (BSTR str);
Callback Handler;

extern "C" 
{   
      void __declspec(dllexport) __stdcall SetCallback(Callback handler);
      void __declspec(dllexport) __stdcall SendReceiveMessage(BSTR arr1); 
     }

 void __stdcall SendReceiveMessage(BSTR arr1) {
   Handler(arr1);
 }

void __stdcall SetCallback(Callback handler1) {
   Handler = handler1;
}

void CCall::sendmsg(FILE *fp)
{
//do some work
    try
{
    char *str;
    char *Tag_t;

    str = new char[2048];
    Tag_t = new char[1024];

    sprintf(str, "<body><Tag1>%d</Tag1 ><Tag2>%s</Tag2>",sumNum, SumString);

    for (int i = 0; i < sumNum; i++)
    {

        sprintf(Tag_t,"<Tag3>%s</Tag3>",tagString3,m_csqIDs[i],i);
        strcat(str,Tag_t);
    }
    strcat(str,"</body>");

    int wslen = MultiByteToWideChar(CP_ACP, 0, str, strlen(str), 0, 0);
    BSTR bstr = SysAllocStringLen(0, wslen);
    MultiByteToWideChar(CP_ACP, 0, str, strlen(str), bstr, wslen);
    // Use bstr here
    SendReceiveMessage(bstr);
    SysFreeString(bstr);

    //SysFreeString(bstr);
    delete[] str;
    delete[] Tag_t;
}
catch(std::bad_alloc& exc)
{

    return;
}
  }

これがこれを行う正しい方法であるかどうかを提案してください。

4

0 に答える 0