C++ 回调将文本发送回 C# [英] C++ Callback to send text back to C#
问题描述
我是 C++ 的新手.有人告诉我,使用 C++ 的回调"是最好的解决方案.这是我的情况.
I'm new to C++. I have been told using a "callback" with C++ is the best solution for this. Here is my situation.
我有一个用 C++ 编写的 DLL
这个 DLL 有一个方法来启动通过 C# 代码运行的服务(这很好用)
当 DLL 中的服务运行时,我希望 DLL 将文本传回给 C# 代码,这只是进度代码,例如第一阶段开始"和第一阶段完成"
I have a DLL written in C++
this DLL has a method to start the service which is run via the C# code (this works fine)
when the service in the DLL runs I want the DLL to pass back text to the C# code, this is just progress code such as "stage one starting " and "stage one completed"
我环顾四周并被告知实现这一点的最佳方法是使用回调,我真的不知道如何实现这一点.有没有人有任何建议或文章我可以查看?请包括 C++,因为我对 C++ 的经验为零.
I have looked around and been told that the best way to achieve this is to use callbacks, I don't really have a clue how to implement this. Does anyone have any suggestions or articles out there I can check out? Please include C++ as I have zero experience in C++.
干杯
推荐答案
您可以简单地将 C# 字符串传回 C++,并将 C++ 字符串传回 C#.要求是字符串是unicode,分配方式是SysAllocString而不是malloc.您需要转换为 unicode 的任何 ASCII 字符串.
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);
这是为了注册 C# dll
And this to register the C# dll
Assembly asm = Assembly.LoadFile (@"c: empImageConverter.dll");
RegistrationServices regAsm = new RegistrationServices();
bool bResult = regAsm.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase);
这将 Unicode 转换为 ASCII,反之亦然.
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;
}
和 .NET 代码:
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: empsubtract.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: empConcat.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
请在此处查看详细信息:
See here for closer information:
http://support.microsoft.com/kb/828736
http://msdn.microsoft.com/en-us/library/ms734686.aspx
这篇关于C++ 回调将文本发送回 C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!