Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过回调在托管代码和非托管代码之间调用_C#_C++_Memory Management_Unmanaged_Managed - Fatal编程技术网

C# 通过回调在托管代码和非托管代码之间调用

C# 通过回调在托管代码和非托管代码之间调用,c#,c++,memory-management,unmanaged,managed,C#,C++,Memory Management,Unmanaged,Managed,在托管代码和非托管代码之间传递字符串时,我一直面临很多问题。在搜索和组合代码之后,我找到了一个似乎有效的解决方案。但我仍然不确定它是否是正确的实现 在我的代码中,C将委托函数传递给C++。现在C++在需要时调用该函数。C++需要发送字符串,以便我使用BSTR调用回调函数。我就是这样实现的 C# C++ typedef void(u stdcall*回调)(BSTR str); 回调处理程序; 外部“C” { void uu declspec(dllexport)u stdcall SetC

在托管代码和非托管代码之间传递字符串时,我一直面临很多问题。在搜索和组合代码之后,我找到了一个似乎有效的解决方案。但我仍然不确定它是否是正确的实现

<>在我的代码中,C将委托函数传递给C++。现在C++在需要时调用该函数。C++需要发送字符串,以便我使用BSTR调用回调函数。我就是这样实现的

C#

C++

typedef void(u stdcall*回调)(BSTR str);
回调处理程序;
外部“C”
{   
void uu declspec(dllexport)u stdcall SetCallback(回调处理程序);
void uu declspec(dllexport)uu stdcall send receivemessage(BSTR arr1);
}
无效\uu stdcall发送接收消息(BSTR arr1){
处理程序(arr1);
}
void\uu stdcall SetCallback(回调句柄1){
Handler=handler1;
}
void CCall::sendmsg(文件*fp)
{
//做些工作
尝试
{
char*str;
字符*标记;
str=新字符[2048];
Tag_t=新字符[1024];
sprintf(str,“%d%s”,sumNum,SumString);
for(int i=0;i

请建议这样做是否正确?

您不应该调用
SysFreeString(bstr)两次,是吗?你是对的,我不应该。我从上面的代码中注释掉了它。
[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);  }
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;
}
  }