C# 向VC++发送消息 我现在想VC++发送消息,发送的是一个结构,里面有字符串型、整型和布尔型值,对于整型和布尔型都没有问题,但对于字符串型的显示为乱码,有没有解决办法?或者有没有相关代码,包括发送和接收代码,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为C# 没指针。一般我调用C++ 遇到需要传字符串类型的我就将 字符串变量 赋值给 STRINGBUILDER 类型 然后将这个变量赋值过去就可以了。 同意楼上,MSDN上也推荐用SB平台调用字符串传参 编码方式的问题吧C#一个CHAR是两个字节的长度,C++如果不是宽字符就默认是一个字节 可以在C#端控制好编码方式,比如这样:byte[] b = Encoding.GetEncoding("gb2312").GetBytes(myString);这样得到的byte数组传给C++就刚好能转化成字符串了 我的C#代码如下: [DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern int FindWindow(string lpClassName, string lpWindowName); [StructLayout(LayoutKind.Sequential)] public struct COPYDATASTRUCT { public int dwData; public int cbData; public int lpData; } [DllImport("user32", EntryPoint = "SendMessageA")] public static extern int SendMessage(int Hwnd, int wMsg, int wParam, ref COPYDATASTRUCT lParam); const int WM_COPYDATA = 0x004A; [StructLayout(LayoutKind.Sequential)] public struct tagCOPY { public int a1; public int a2; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string szEvent; public bool bEnd; } private void button1_Click(object sender, EventArgs e) { try { COPYDATASTRUCT SendData = new COPYDATASTRUCT(); tagCOPY h = new tagCOPY(); h.a1 = 13; h.a2 = 30; h.bEnd = true; h.szEvent = "sss" + '\0'; int size = Marshal.SizeOf(typeof(tagCOPY)); byte[] Bytes = new byte[size]; //根据定义的尺寸分配内存块 GCHandle GC = GCHandle.Alloc(Bytes, GCHandleType.Pinned); IntPtr ptr1 = GC.AddrOfPinnedObject(); //获得Struct对应的IntPtr Marshal.StructureToPtr(h, ptr1, false); SendData.lpData = ptr1.ToInt32(); SendData.cbData = size; int intHWnd1 = FindWindow(null, "12345"); if (intHWnd1 > 0) { SendMessage(intHWnd1, WM_COPYDATA, 0, ref (SendData)); } } catch { } }C++接收消息代码如下:typedef struct tagCOPY { int a1; int a2; LPTSTR szEvent; BOOL bEnd;} VcCOPY;BOOL CMy22Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { // TODO: Add your message handler code here and/or call default VcCOPY *Strsss; Strsss = (VcCOPY *)pCopyDataStruct->lpData; return CDialog::OnCopyData(pWnd, pCopyDataStruct);}在C++接收到的Strsss 结果为空或者乱码,请问如何解决? C#的配置文件处理 sql数据库语法 C#像千千静听一样头部滚动 ListView 第一行标题栏的字体大小和行高怎样设置呢? “/网上订餐xin”应用程序中的服务器错误。用户 '2C18\ASPNET' 登录失败。原因 DATAGRIDVIEW的问题,分不高,没什么分了,请高手来看看,谢谢 C#里ListView的问题 2 问 我在用c#做oa系统!想结交这方面的朋友!有兴趣的朋友请进!! C# POST问题。 关于WinForm窗体程序的动态添加控件 关于C#中winform中dataGridView的常用方法 C# 语法问题
一般我调用C++ 遇到需要传字符串类型的
我就将 字符串变量 赋值给 STRINGBUILDER 类型 然后将这个变量赋值过去就可以了。
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string
lpWindowName); [StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public int dwData;
public int cbData;
public int lpData;
}
[DllImport("user32", EntryPoint = "SendMessageA")]
public static extern int SendMessage(int Hwnd, int wMsg, int wParam, ref COPYDATASTRUCT lParam);
const int WM_COPYDATA = 0x004A; [StructLayout(LayoutKind.Sequential)]
public struct tagCOPY
{
public int a1;
public int a2;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string szEvent;
public bool bEnd;
}
private void button1_Click(object sender, EventArgs e)
{
try
{ COPYDATASTRUCT SendData = new COPYDATASTRUCT(); tagCOPY h = new tagCOPY();
h.a1 = 13;
h.a2 = 30;
h.bEnd = true;
h.szEvent = "sss" + '\0'; int size = Marshal.SizeOf(typeof(tagCOPY));
byte[] Bytes = new byte[size];
//根据定义的尺寸分配内存块
GCHandle GC = GCHandle.Alloc(Bytes, GCHandleType.Pinned);
IntPtr ptr1 = GC.AddrOfPinnedObject();
//获得Struct对应的IntPtr
Marshal.StructureToPtr(h, ptr1, false);
SendData.lpData = ptr1.ToInt32();
SendData.cbData = size; int intHWnd1 = FindWindow(null, "12345");
if (intHWnd1 > 0)
{
SendMessage(intHWnd1, WM_COPYDATA, 0, ref (SendData));
} }
catch
{ } }
C++接收消息代码如下:
typedef struct tagCOPY
{
int a1;
int a2;
LPTSTR szEvent;
BOOL bEnd;
} VcCOPY;BOOL CMy22Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: Add your message handler code here and/or call default
VcCOPY *Strsss;
Strsss = (VcCOPY *)pCopyDataStruct->lpData;
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}在C++接收到的Strsss 结果为空或者乱码,请问如何解决?