各位老師,請教一個執行緒通信的問題(C#之間,WM_COPYDATA方式,已經能正常收發資料)
1、為什么呼叫函式SendMessage發送后都是回傳0。都是失敗!但是官方檔案描述:(If the receiving application processes this message, it should return TRUE; otherwise, it should return FALSE.)
2、SendMessage 發送函式是說是堵塞方式,關閉接收行程再發送,也沒見卡住現象(沒看到等收方回復情況)?(Sends the specified message to a window or windows. The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message.)
3、接收方是通過什么方式告訴發送方“我已經正常拿走資料了”?讀取lParam嗎?
總之,軟體上想知道:發送方是否成功發送資料
補充:嘗試用C++控制臺發送,也是回傳0(對方有接收到資料了)
uj5u.com熱心網友回復:
Marshal.GetLastWin32Error();具體錯誤代碼可參見https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes
比如1400錯誤為Invalid Handle。
如果你控制接收方,也可以回傳特定代碼1。
BTW,用Windows訊息做行程間通訊的擴展性很差,現在都不建議做的。
uj5u.com熱心網友回復:
如果你控制接收方,也可以回傳特定代碼1。???怎么理解
推薦用共享記憶體方式嗎?
uj5u.com熱心網友回復:
Q: 如果你控制接收方,也可以回傳特定代碼1。???怎么理解A: SendMessage 回傳的是一個LRESULT,32位程式上就是一個int。你想回傳什么實際上都可以。
Q: 推薦用共享記憶體方式嗎?
A: 取決于你的需要,比如
有資訊互動的情況,命名管道較優;
單向大檔案資料,記憶體映射檔案;
簡單通知,命名信號最簡單;
想同時支持linux版本,用socket。
uj5u.com熱心網友回復:
SendMessage作為通信有些局限:1、需要有訊息回圈。
2、SendMessage局限于Session,也就是桌面程式不能和服務程式跨過session邊界進行SendMessage通訊。
3、權限低的程式,不能向權限高的程式(比如那么用UAC提升后的程式)發訊息。
4、較容易招致攻擊,其他程式可以通過SendMessage來激發/騙取行為。
uj5u.com熱心網友回復:
SendMessage 訊息接收在DefWndProc里面,VOID,不知道是哪個步驟做了回傳,或哪里做回傳。
protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
case ImportFromDLL.WM_COPYDATA:
ImportFromDLL.COPYDATASTRUCT cdata = new ImportFromDLL.COPYDATASTRUCT();
Type mytype = cdata.GetType();
cdata = (ImportFromDLL.COPYDATASTRUCT)m.GetLParam(mytype);
//第一行插入資料方式
//dwData值
textBox_RiZ.Text = textBox_RiZ.Text.Insert(0, DateTime.Now.ToLongTimeString().ToString() + ">>>>>>>>>>>" + Environment.NewLine);
textBox_RiZ.Text = textBox_RiZ.Text.Insert(0, "dwData="https://bbs.csdn.net/topics/ + cdata.dwData + Environment.NewLine);
textBox_RiZ.Text = textBox_RiZ.Text.Insert(0, "cbData="https://bbs.csdn.net/topics/ + cdata.cbData + Environment.NewLine);
textBox_RiZ.Text = textBox_RiZ.Text.Insert(0, "lpData="https://bbs.csdn.net/topics/ + cdata.lpData + Environment.NewLine);
break;
//default:
// base.DefWndProc(ref m);
// break;
}
base.DefWndProc(ref m);
}
uj5u.com熱心網友回復:
m.Result = (IntPtr)1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/71735.html
標籤:C#
上一篇:c#
下一篇:NFine開源框架
