C++ Callback to send text back to C#

前端 未结 4 1880
有刺的猬
有刺的猬 2021-01-03 09:14

I\'m new to C++. I have been told using a \"callback\" with C++ is the best solution for this. Here is my situation.

I have a DLL written in C++
this DLL has

4条回答
  •  太阳男子
    2021-01-03 10:06

    You can simply pass a C# string back to C++ and a C++ string to C#. The requirement is that the string is unicode and the allocation method is SysAllocString and not malloc. Any ASCII string you need to convert to unicode.

    const wchar_t* theString = L"hello";
    BSTR bstr = SysAllocString(theString);
    DoSomething(bstr);
    SysFreeString(bstr);
    

    And this to register the C# dll

    Assembly asm = Assembly.LoadFile (@"c:\temp\ImageConverter.dll");
    RegistrationServices regAsm = new RegistrationServices();
    bool bResult = regAsm.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase);
    

    And this to convert Unicode to ASCII and vice-versa.

    inline BSTR Cstring2VBstring(char *szString)
    {
        WCHAR* res = NULL;
        BSTR bs;
        DWORD n;
        char *sz = NULL;
        if (*szString && szString)
        {
            sz = strdup(szString);
            n = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sz, -1, NULL, 0);
    
            if (n)
            {
                res = (WCHAR*) malloc(n * sizeof(char) );
                MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sz, -1, res, n);
            }
    
        }
    
        bs = SysAllocString( (const OLECHAR*) res);
        free(sz);
        return bs;
    }
    
    
    
    // C String to BSTR conversion (2)
    BSTR Cstringn2VBstring(char *szString, int dwSize)
    {
        WCHAR* res = NULL;
        BSTR bs;
        DWORD n = (DWORD) dwSize;
        char *sz = NULL;
        if (*szString)
        {
            sz = (char*) malloc(dwSize);
            memcpy(sz, szString, dwSize);
            n = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sz, n, NULL, 0);
            if(n)
            {
                res = (WCHAR*) malloc(n * sizeof(char) );
                MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sz, -1, res, n);
            }
        }
        bs = SysAllocStringLen( (const OLECHAR*) res, n);
    
        free(sz);
        return bs;
    }
    

    And the .NET code:

    Namespace TestLibrary2
        ' Interface declaration. '
        Public Interface ICalculator
            Function Add(ByVal Number1 As Integer, ByVal Number2 As Integer) As Integer
            Function Subtract(ByVal Number1 As Long, ByVal Number2 As Long) As Long
            Function ReturnValue() As String
            Function Concat(ByVal Number1 As String, ByVal Number2 As String) As String
    
            Sub Concat2(ByVal Number1 As String, ByVal Number2 As String)
    
            Function isTrue(ByVal bInputvalue As Boolean) As Boolean
            Function isTrue2(ByRef bInputvalue As Boolean) As Boolean
        End Interface
    
    
    
        ' Interface implementation. '
        Public Class ManagedClass
            Implements ICalculator
    
    
            Public Function Add(ByVal Number1 As Integer, ByVal Number2 As Integer) As Integer Implements ICalculator.Add
                Return Number1 + Number2
            End Function
    
    
            Public Function Subtract(ByVal Number1 As Long, ByVal Number2 As Long) As Long Implements ICalculator.Subtract
                Try
                    System.IO.File.WriteAllText("c:\temp\subtract.txt", "Subtracted: ")
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
    
                Return Number1 - Number2
            End Function
    
    
            Public Function Concat(ByVal Number1 As String, ByVal Number2 As String) As String Implements ICalculator.Concat
                Try
                    System.IO.File.WriteAllText("c:\temp\Concat.txt", "Nummer1: " + Number1 + vbCrLf + "Nummer2:" + Number2)
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
    
                Dim strReturnValue As String = Number1 + Number2
                Return strReturnValue
            End Function
    
    
            Public Sub Concat2(ByVal Number1 As String, ByVal Number2 As String) Implements ICalculator.Concat2
                Console.WriteLine("moo")
            End Sub
    
    
            Public Function ReturnValue() As String Implements ICalculator.ReturnValue
                Dim x As String = "moooooo"
                Return x
            End Function
    
    
            Public Function isTrue(ByVal bInputvalue As Boolean) As Boolean Implements ICalculator.isTrue
                If bInputvalue = True Then
                    Return True
                End If
                Return False
            End Function
    
    
            Public Function isTrue2(ByRef bInputvalue As Boolean) As Boolean Implements ICalculator.isTrue2
                If bInputvalue = True Then
                    Return True
                End If
                Return False
            End Function
    
        End Class
    
    
    End Namespace
    

    Edit:
    See here for closer information:

    http://support.microsoft.com/kb/828736
    http://msdn.microsoft.com/en-us/library/ms734686.aspx

提交回复
热议问题