关于SendMessage的问题?急!

ERT 2002-04-17 04:07:44
请帮我解答VC中SendMessage(HWND handle,WM_MYMESSAGE,WPARAM wParam,LPARAM lParam)中的四个参数含义,及使用,我有急用呀!!!我正在做一个DLL文件,通过
VB使用这个DLL把VB窗口中的消息和数据发送到VC++程序中,而且不知道数据传送是否使用该函数。我是个初学者如果有可能的话,请高手们帮我详细的解答这个问题,比如传递
一个IDOK消息或者是一个字符串。如果可能的话,请给我一个这个例子的代码?我的信箱是diyunfei@163.com呵呵。
...全文
1327 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
ERT 2002-05-22
  • 打赏
  • 举报
回复
多谢大家的热心帮助!传递字符串的部分我已经解决了,多亏大家帮忙!
我是过的方法: jishiping(JSP 季世平) 的共享内存的方法可以实现(在两个exe中建立一个相同的类,基类为CRecordSet); jishiping(JSP 季世平) 的
原子ATOM的方法也可以实现;ejetcs(ejetcs)所说的WM_COPYDATA,可以传递一个系统的结构,结构中有三个变量(两个整型,一个字符串),可以传递字符串。
jishiping 2002-04-25
  • 打赏
  • 举报
回复
这儿 MESSAGE 是你自己定义的一个消息,比如:
#define WM_MYMSG0 (WM_APP+0)

那么程序就是:
SendMessage(hWnd, WM_MYMSG0, 0, 0);
在这个例子里,后面的两个参数没用着。比如,你想通过同一个消息做
各种不同的事,你可以用这两个参数来区别。
ERT 2002-04-25
  • 打赏
  • 举报
回复
jishiping(JSP 季世平)
还有一个问题.我们老师不希望我们用注册消息的方法做,希望我们用结构。
我理解是他说的结构的原理与你的建类的原理差不多。
问题是:你的方法中的SendMessage(hWnd, MESSAGE, 0, 1)中的MESSAGE值得是不是也是注册的消息呀,不用可以吗?还有,后面的两个变量是不是没有用了(我感觉是没有什么用的)?

急用!谢了!
iamxgl 2002-04-24
  • 打赏
  • 举报
回复
dll里面要是没有窗体,谁来接收这个消息?
这位仁兄可能是有点误解,SendMessage是用来发消息的,而且接受消息的是个窗体(HWND参数指定),你要送消息去Dll,这有点不合理的。送数据就更是不行了,这个数据有很多方法可以送,写个export函数在VB里调用,把数据传到dll里就行了,用sendmessage不好。
ERT 2002-04-24
  • 打赏
  • 举报
回复
TO:jishiping(JSP 季世平)
分配内存的方法,不能显示正确的字符串,总是显示"B",WHY?
ERT 2002-04-24
  • 打赏
  • 举报
回复
TO:qiuanhong(爱写程序)
试过你的例子,可是接收方压根就不显示,WHY?
jishiping 2002-04-24
  • 打赏
  • 举报
回复
To qiuanhong(爱写程序):
你这是在同一个程序里。在不同程序里是不行的。
qiuanhong 2002-04-24
  • 打赏
  • 举报
回复
实例:

LONG CSeimensSMSDlg::OnMyMsg(WPARAM wParam,LPARAM lparam)
{
CString *pText=(CString*)lparam;
SetDlgItemText(IDC_MYMSG,pText->GetBuffer(pText->GetLength()));
delete pText;
return 1;
}

void CSeimensSMSDlg::OnButton2()
{
// TODO: Add your control notification handler code here
CString *text=new CString;
text->Format("Hello");
SendMessage(WM_MYMSG,(WPARAM)0,(LPARAM)text);
}
qiuanhong 2002-04-24
  • 打赏
  • 举报
回复
不会是这样的吧,我在DIALOG上用一个文本框(ID:IDC_MYMSG)

LONG CSeimensSMSDlg::OnMyMsg(WPARAM wParam,LPARAM lparam)
{
CString *pText=(CString*)lparam;
SetDlgItemText(IDC_MYMSG,pText->GetBuffer(pText->GetLength()));
delete pText;
return 1;
}

void CSeimensSMSDlg::OnButton2()
{
// TODO: Add your control notification handler code here
CString *text=new CString;
text->Format("Hello");
SendMessage(WM_MYMSG,(WPARAM)0,(LPARAM)text);
}

注:LONG CSeimensSMSDlg::OnMyMsg(WPARAM wParam,LPARAM lparam)
是自定义消息处理函数啊~~~~
兄弟,我亲手写的,还在文本框里显示出了"hello"了呀

不过,有可能这不是你所需要的......
ERT 2002-04-24
  • 打赏
  • 举报
回复
jishiping(JSP 季世平) 的方法可以实现传字符串!
ejetcs 2002-04-24
  • 打赏
  • 举报
回复
可以使用WM_COPYDATA消息传递字符串数据,请参考msdn中WM_COPYDATA的说明
jishiping 2002-04-24
  • 打赏
  • 举报
回复
标准的C++的类,没有任何基类。发送和接收双方都要建这个类。
ERT 2002-04-24
  • 打赏
  • 举报
回复
TO:jishiping(JSP 季世平)
请问你建的类是在MFC ClassWizard 里实现的吗?
发送和接收双方都要建这个类吗?
建的类的基类是CDataPathProperty吗?
Kevin_C_K 2002-04-24
  • 打赏
  • 举报
回复
ok
lvxn_sina 2002-04-24
  • 打赏
  • 举报
回复
靠~~~~~~~~

还有这样的问题!!
自己看消息了呀!

IDOK是通过WM_COMMAND传递的!
::SendMessage(hWnd, WM_COMMAND, IDOK, 0L);
jishiping 2002-04-24
  • 打赏
  • 举报
回复
对不起,上面用GlobalAlloc分配内存的方法有问题。现提供一个共享内存
的方法。给你一个共享内存的class。一定可以,我已经用了好多年了。

class TSharedMem
{
private:
HANDLE Handle;
public:
char *Data;

TSharedMem(const char* Name, int Size);
~TSharedMem();
};

TSharedMem::TSharedMem(const char* Name, int Size)
: Data(NULL)
{
Handle = CreateFileMapping((HANDLE)0xFFFFFFFF,
NULL, PAGE_READWRITE, 0, Size, Name);
bool Created = GetLastError() == 0;
if (Handle != 0)
Data = (char*)MapViewOfFile(Handle,
FILE_MAP_WRITE, 0, 0, Size);
if (Data!=NULL && Created)
ZeroMemory(Data, Size);
}

TSharedMem::~TSharedMem()
{
if (Data != NULL)
UnmapViewOfFile(Data);
if (Handle != NULL)
CloseHandle(Handle);
}

TSharedMem Mem("共享内存名", 256);
if (Mem.Data != NULL)
strcpy(Mem.Data, "要传送的字符串");
SendMessage(hWnd, MESSAGE, 0, 1);

在HandleMessage中这样:
LRESULT CDakaileDlg::OnMsg(WPARAM wParam,LPARAM lParam)
{
TSharedMem Mem("共享内存名", 256);
SetDlgItemText(IDC_STATIC_SHOW, Mem.Data);
return TRUE;
}
ERT 2002-04-24
  • 打赏
  • 举报
回复
我没有用到dll,也不用VB,只是两个EXE的消息传送!
jishiping 2002-04-23
  • 打赏
  • 举报
回复
写错了。用GlobalAddAtom生成的ATOM,应该用GlobalGetAtomName
来取得ATOM的内容。
LRESULT CDakaileDlg::OnMsg(WPARAM wParam,LPARAM lParam)
{
char buf[128];
GlobalGetAtomName((ATOM)lParam, buf, sizeof(buf));
SetDlgItemText(IDC_STATIC_SHOW,buf);
return TRUE;
}
ERT 2002-04-23
  • 打赏
  • 举报
回复
消息处理部分有问题,类型好像不太对呀。怎么办?
lizmei001 2002-04-23
  • 打赏
  • 举报
回复
ERT() :你要传一个字符串的话可以这样传
CString str;
SendMessage(WM_SENDSTR, (WPARAM)str.GetLenght(), (LPARAM)&str);

在消息处理中:
CString *str1 = lParam;
CString str = &str1;
这样也取得到字符串,我用过的,不过是在本进程的一个线程向主线程发送字符串的
加载更多回复(24)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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