六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

處理.net開發問題的最終法寶

[摘要]這兩天正在網上找工作。昨天一網友問了個問題,說SendMessage在.net中調用失敗。我看了看他的代碼是用VB.net寫的。于是我改用C#寫了個小的測試程序using System.Runtime.InteropServices;[DllImport("user32.dll"...
這兩天正在網上找工作。昨天一網友問了個問題,說SendMessage在.net中調用失敗。
我看了看他的代碼是用VB.net寫的。于是我改用C#寫了個小的測試程序
using System.Runtime.InteropServices;

[DllImport("user32.dll")]
private static extern long SendMessageW(int hwnd,int wMsg,int wParam,int lParam);

System.Diagnostics.Process[] p;
p=System.Diagnostics.Process.GetProcessesByName("notepad");
int i=p[0].Handle.ToInt32();
SendMessageW(i,16,0,0);

(因為SendMessage分兩個版本,一個是SendMessageA一個是SendMessageW,由于NT下內部使用的是SendMessageW,而SendMessageA的調用則是先將參數轉換后再調用SendMessageW,所以這里我是用SendMessageW。)
這個程序的功能是查找一個記事本程序,然后向他發送關閉消息。
試驗了一下,果然失敗了。
開始我懷疑是.net的問題,因為一個網友曾經說過在VB中調用成功的代碼在VB.net中調用失敗了。于是我是用ILDASM對該程序進行反匯編。反編譯后IL代碼如下。
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// 代碼大小 40 (0x28)
.maxstack 4
.locals init ([0] class [System]System.Diagnostics.Process[] p,
[1] int32 i,
[2] native int CS$00000002$00000000)
IL_0000: ldstr "notepad"
IL_0005: call class [System]System.Diagnostics.Process[] [System]System.Diagnostics.Process::GetProcessesByName(string)
IL_000a: stloc.0
IL_000b: ldloc.0
IL_000c: ldc.i4.0
IL_000d: ldelem.ref
IL_000e: callvirt instance native int [System]System.Diagnostics.Process::get_Handle()
IL_0013: stloc.2
IL_0014: ldloca.s CS$00000002$00000000
//這里是SendMessageW調用的部分將p[0].Handle.ToInt32()放入參數1
IL_0016: call instance int32 [mscorlib]System.IntPtr::ToInt32()
IL_001b: stloc.1
IL_001c: ldloc.1
//放入16,參數2
IL_001d: ldc.i4.s 16
//放入0,參數3
IL_001f: ldc.i4.0
//放入0,參數4
IL_0020: ldc.i4.0
IL_0021: call int64 TWin.Class1::SendMessageW(int32,
int32,
int32,
int32)
IL_0026: pop
IL_0027: ret
看不出有什么問題,本來我以為是不是某個值被裝箱之類的操作了。一看所有參數都是標準的int32類型,這個可是值啊。
我并沒有就此覺悟,反而還是執迷不悟的懷疑是.net出的問題。
于是運行程序,在SendMessageW(i,16,0,0)處設置斷點,看看匯編碼。(運行時,在代碼的旁邊有個反匯編的tab,通過它你就可以看到匯編碼了)
0000004f push 0
00000051 push 0
00000053 mov ecx,edi
00000055 mov edx,10h
0000005a call dword ptr ds:[009C50F8h]
00000060 nop
在Win32匯編中API函數的調用使用的方法是將參數值壓入棧中(后進現出)的原則,所以參數壓入順序為4321。
匯編中的語句
0000004f push 0
00000051 push 0
00000053 mov ecx,edi
00000055 mov edx,10h
都沒錯。唯一有可能出錯的就是
0000005a call dword ptr ds:[009C50F8h]
于是問題很清楚了,.net調用API函數的方法沒有錯,是傳遞的參數出了錯。用VC++的工具SPY++看看吧,果然發現句柄與p[0].Handle.ToInt32()不符。無意間發現p[0].MainWindowHandle與SPY++的結果相符,忽然間恍然大悟。大罵自己愚蠢分明需要給程序的窗體傳送消息,你給那個進程ID傳送,人家誰理你啊!
改用p[0].MainWindowHandle實驗,記事本被關閉了。雖然犯了傻不過倒是總結了些解決.net出的問題的一些方法,如果你有些問題感到莫名其妙,找不到方法就不如用ILDASM去反編譯一下,看看IL代碼說不定有幫助,如果還不行,干脆就用看看匯編碼,說不定問題就明白了。
告訴他后,他又問了我另一個問題,一個窗體如何得到自己的句柄呢,其實這個很簡單,this.Handle.ToInt32()就是自己的句柄了。
結尾打個廣告吧,本人軟開工作兩年想找一份月薪3000元的北京的工作。有意者請與我聯系fjl716@16


主站蜘蛛池模板: 手机在线日韩高清理论片 | 香蕉久久夜色精品国产尤物 | 亚洲欧美一区二区三区不卡 | 日本不卡视频在线视频观看 | 星辰影院在线观看高清免费观看 | 伊人中文字幕在线 | 亚洲国产青草 | 天天看片天天a免费观看 | 亚洲成a人片在线观看中文动漫 | 爽爽影院在线 | 亚洲国产综合精品中文字幕 | 欧美一区二区精品系列在线观看 | 亚洲国产精品久久久天堂麻豆 | 日本高清在线一区 | 天天躁狠狠躁狠狠躁夜夜躁 | 婷婷综合激情五月中文字幕 | 日韩成人免费观看 | 欧美午夜免费观看福利片 | 欧美综合精品 | 婷婷春色 | 婷婷在线网 | 一级毛片a| 亚洲午夜高清 | 天天搞夜夜爽 | 天天透天天射 | 午夜视频一区二区 | 天天搞夜夜爽 | 亚洲欧美在线综合一区二区三区 | 日韩黄页| 日产精品一区到六区免费 | 亚洲成a人片毛片在线 | 天天爽夜夜爽一区二区三区 | 日韩欧国产精品一区综合无码 | 色狠狠色狠狠综合天天 | 伊人网综合在线 | 五月综合激情 | 日本五级床片全部硬硬 | 日韩午夜在线视频不卡片 | 亚洲欧美中文日韩v在线观看 | 亚洲欧美综合另类 | 啪啪色视频 |