c++发送消息给c#的进程,c#通过重写DefWndProc来接收的消息

starriver9101 2018-11-12 11:51:39
C++dll 使用SendMessage方法发送给C#编写的exe数据
C++代码
struct CopyDataStruct {
/*LPARAM dwData;
LONG cbData;*/
LPCSTR lpData;
};


int _stdcall SendData(int handle, char* strURL)
{
static CopyDataStruct lparam;
HWND hWnd = FindWindow(NULL, _T("Form2"));
lparam.lpData = "For";
CString strg = _T("For");
/*lparam.cbData = strg.GetLength() + 1;
lparam.dwData = 11;*/
::SendMessage(hWnd, 0x0400, 0, (LPARAM)&lparam);
return 10;
}


C#代码
protected override void WndProc(ref System.Windows.Forms.Message e)
{
if (e.Msg == 0x0400)
{
string result = Marshal.PtrToStringAnsi(e.LParam);
object lparam = (CopyDataStruct)e.GetLParam(typeof(CopyDataStruct));
object mystr = (CopyDataStruct)Marshal.PtrToStructure(e.LParam, typeof(CopyDataStruct));
}
base.WndProc(ref e);
}

public struct CopyDataStruct
{
//public IntPtr handle;//句柄
//public int type;//参数类型 1 下诊断 2.下医嘱 3.检验检查回报

[MarshalAs(UnmanagedType.LPStr)]
public string lpData; //json字符串
}


更换了许多次类型都不合适,大部分时候报错信息是这样的



...全文
485 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
首先,这个CopyDataStruct应该正确声明:https://docs.microsoft.com/en-us/windows/desktop/api/Winuser/ns-winuser-tagcopydatastruct
然后:
public struct CopyDataStruct
{
//...
IntPtr lpData; //json字符串
}

protected override void WndProc(ref System.Windows.Forms.Message e)
{
if (e.Msg == WM_COPYDATA)
{
CopyDataStruct CDS = (CopyDataStruct)Marshal.PtrToStructure(e.LParam, typeof(CopyDataStruct));
string result = Marshal.PtrToStringAnsi(CDS.lpData);
// ...
}
base.WndProc(ref e);
}
starriver9101 2018-11-15
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行! 写日志到文件参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _MSC_VER
    #pragma warning(disable:4996)
    #include <windows.h>
    #include <io.h>
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  _vsnprintf         vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef _MSC_VER
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt||0==pszFmt[0]) return;
    _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
    int i;
#ifdef _MSC_VER
    InitializeCriticalSection(&cs_log);
#else
    pthread_mutex_init(&cs_log,NULL);
#endif
    for (i=0;i<10000;i++) {
        Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
    }
#ifdef _MSC_VER
    DeleteCriticalSection(&cs_log);
#else
    pthread_mutex_destroy(&cs_log);
#endif
    return 0;
}
//1-79行添加到你带main的.c或.cpp的那个文件的最前面
//81-86行添加到你的main函数开头
//90-94行添加到你的main函数结束前
//在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中
这是C++这边的日志,其他地方我觉得没有需要写进日志的东西了 [code=C] static CopyDataStruct lparam; HWND hWnd = FindWindow(NULL, _T("Form2")); lparam.lpData = "For"; CString strg = _T("For"); /*lparam.cbData = strg.GetLength() + 1; lparam.dwData = 11;*/ ::SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&lparam); Log("This is a Log %04d from FILE:%s LINE:%d\n", 50, hWnd, lparam); Log("This is a Log %04d from FILE:%s LINE:%d\n", 51, &lparam, (LPARAM)&lparam); [/code] 2018-11-15 10:26:21.639 This is a Log 0050 from FILE: LINE:261311720 2018-11-15 10:26:21.640 This is a Log 0051 from FILE:鐻? LINE:261341732
starriver9101 2018-11-15
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行! 写日志到文件参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _MSC_VER
    #pragma warning(disable:4996)
    #include <windows.h>
    #include <io.h>
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  _vsnprintf         vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef _MSC_VER
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt||0==pszFmt[0]) return;
    _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
    int i;
#ifdef _MSC_VER
    InitializeCriticalSection(&cs_log);
#else
    pthread_mutex_init(&cs_log,NULL);
#endif
    for (i=0;i<10000;i++) {
        Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
    }
#ifdef _MSC_VER
    DeleteCriticalSection(&cs_log);
#else
    pthread_mutex_destroy(&cs_log);
#endif
    return 0;
}
//1-79行添加到你带main的.c或.cpp的那个文件的最前面
//81-86行添加到你的main函数开头
//90-94行添加到你的main函数结束前
//在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中
赵老师,问题抽象一下这个过程并不复杂,C++这边将需要传送数据赋值给定义的结构,FindWindow通过标题找到C#窗口,使用SendMessage将数据传送过去 C#就是重写接收消息的函数,如果是消息类型对应一致,将参数解析成对应类型的数据,就是解析的时候报错了 C++ [code=C] struct CopyDataStruct { LPCSTR lpData; }; [/code] C#

public struct CopyDataStruct
        {
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData; //json字符串
        }
CopyDataStruct-> (LPARAM)&lparam -> CopyDataStruct 这个转换过程最后出错了
starriver9101 2018-11-15
  • 打赏
  • 举报
回复
引用 13 楼 DelphiGuy 的回复:
c#端可以把lpData指向的数据复制出来,ms文档中说了WM_COPYDATA发送的数据应该被认为是只读的,而且应该认为只在消息处理期间有效。
处理的时候确实是在C#编写的exe接收消息的过程中处理的,但是转换对应类型的时候报错了
starriver9101 2018-11-15
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
为什么不使用共享纯文本文件作为两种环境间的交流信息的首选呢?
确实作为首选了,但还是想了解这种方式为什么会出错,原因已经找到了,数据结构定义的格式有问题,最后还是非常感谢
starriver9101 2018-11-15
  • 打赏
  • 举报
回复
引用 17 楼 DelphiGuy 的回复:
首先,这个CopyDataStruct应该正确声明:https://docs.microsoft.com/en-us/windows/desktop/api/Winuser/ns-winuser-tagcopydatastruct 然后: public struct CopyDataStruct { //... IntPtr lpData; //json字符串 } protected override void WndProc(ref System.Windows.Forms.Message e) { if (e.Msg == WM_COPYDATA) { CopyDataStruct CDS = (CopyDataStruct)Marshal.PtrToStructure(e.LParam, typeof(CopyDataStruct)); string result = Marshal.PtrToStringAnsi(CDS.lpData); // ... } base.WndProc(ref e); }
非常感谢,确实是没有采用标准结构定义导致的原因,太谢谢了
赵4老师 2018-11-15
  • 打赏
  • 举报
回复
为什么不使用共享纯文本文件作为两种环境间的交流信息的首选呢?
赵4老师 2018-11-14
  • 打赏
  • 举报
回复
有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行! 写日志到文件参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _MSC_VER
#pragma warning(disable:4996)
#include <windows.h>
#include <io.h>
#else
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#define CRITICAL_SECTION pthread_mutex_t
#define _vsnprintf vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef _MSC_VER
void Lock(CRITICAL_SECTION *l) {
EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
struct tm *now;
struct timeb tb;

if (NULL==pszFmt||0==pszFmt[0]) return;
_vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,logstr);
flog=fopen(logfilename1,"a");
if (NULL!=flog) {
fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
if (ftell(flog)>MAXLOGSIZE) {
fclose(flog);
if (rename(logfilename1,logfilename2)) {
remove(logfilename2);
rename(logfilename1,logfilename2);
}
} else {
fclose(flog);
}
}
}
void Log(const char *pszFmt,...) {
va_list argp;

Lock(&cs_log);
va_start(argp,pszFmt);
LogV(pszFmt,argp);
va_end(argp);
Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
int i;
#ifdef _MSC_VER
InitializeCriticalSection(&cs_log);
#else
pthread_mutex_init(&cs_log,NULL);
#endif
for (i=0;i<10000;i++) {
Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
}
#ifdef _MSC_VER
DeleteCriticalSection(&cs_log);
#else
pthread_mutex_destroy(&cs_log);
#endif
return 0;
}
//1-79行添加到你带main的.c或.cpp的那个文件的最前面
//81-86行添加到你的main函数开头
//90-94行添加到你的main函数结束前
//在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中
  • 打赏
  • 举报
回复
c#端可以把lpData指向的数据复制出来,ms文档中说了WM_COPYDATA发送的数据应该被认为是只读的,而且应该认为只在消息处理期间有效。
  • 打赏
  • 举报
回复
引用 7 楼 cjc864520352 的回复:
[quote=引用 5 楼 DelphiGuy 的回复:]
[quote=引用 4 楼 cjc864520352 的回复:]
[quote=引用 2 楼 DelphiGuy 的回复:]
用WM_COPYDATA

你好,WM_COPYDATA 的值就是0x0400[/quote]

winuser.h
#define WM_COPYDATA 0x004A
[/quote]

抱歉,我之前用的是WM_USER,但是这个只是影响是否能接收到数据吧,既然能接收到了,转成制定类型的时候报错,跟前面没有关系了[/quote]

windows对WM_COPYDATA做了特殊处理,可以跨进程传递数据(要不为什么叫WM_COPYDATA呢)。
赵4老师 2018-11-13
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
starriver9101 2018-11-13
  • 打赏
  • 举报
回复
引用 5 楼 DelphiGuy 的回复:
[quote=引用 4 楼 cjc864520352 的回复:] [quote=引用 2 楼 DelphiGuy 的回复:] 用WM_COPYDATA
你好,WM_COPYDATA 的值就是0x0400[/quote] winuser.h #define WM_COPYDATA 0x004A [/quote] 抱歉,我之前用的是WM_USER,但是这个只是影响是否能接收到数据吧,既然能接收到了,转成制定类型的时候报错,跟前面没有关系了
starriver9101 2018-11-13
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
理解讨论之前请先学会如何观察http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
抱歉,我不了解老师你说的意思
starriver9101 2018-11-13
  • 打赏
  • 举报
回复
引用 9 楼 DelphiGuy 的回复:
[quote=引用 7 楼 cjc864520352 的回复:] [quote=引用 5 楼 DelphiGuy 的回复:] [quote=引用 4 楼 cjc864520352 的回复:] [quote=引用 2 楼 DelphiGuy 的回复:] 用WM_COPYDATA
你好,WM_COPYDATA 的值就是0x0400[/quote] winuser.h #define WM_COPYDATA 0x004A [/quote] 抱歉,我之前用的是WM_USER,但是这个只是影响是否能接收到数据吧,既然能接收到了,转成制定类型的时候报错,跟前面没有关系了[/quote] windows对WM_COPYDATA做了特殊处理,可以跨进程传递数据(要不为什么叫WM_COPYDATA呢)。 [/quote] 你好,我修改之后还会报错,但是报错信息不一样了 我在网上搜索到的解决方案都是把变量设置为静态,但是依旧会报错
赵4老师 2018-11-12
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
数据的结构很复杂的话,文本文件的格式问题可参考json或xml

共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……

“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
回头是“使用共享纯文本文件进行信息交流”的岸!
赵4老师 2018-11-12
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
  • 打赏
  • 举报
回复
引用 4 楼 cjc864520352 的回复:
[quote=引用 2 楼 DelphiGuy 的回复:]
用WM_COPYDATA

你好,WM_COPYDATA 的值就是0x0400[/quote]

winuser.h
#define WM_COPYDATA 0x004A
starriver9101 2018-11-12
  • 打赏
  • 举报
回复
引用 2 楼 DelphiGuy 的回复:
用WM_COPYDATA
你好,WM_COPYDATA 的值就是0x0400
starriver9101 2018-11-12
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
感谢赵老师的回复,给了我一种思维上的开拓,这个方法确实能解决我的问题,许多问题多了解一种解决方法总是好的,因为有些情况下可能有的方法不会通用,而且这个问题之前困扰我几天,所以我希望能够找到原因所在,C#与C#发是没有问题的,我很奇怪C++发给C#为什么会出错,还是这样的错误,希望赵老师可以为我解答这个困惑,不管如何,感谢赵老师,让我的问题有了新的解决方式
  • 打赏
  • 举报
回复
用WM_COPYDATA

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧