欢迎大家光临【无师自通-教程网】您的到来是我们的荣幸。本站提供photoshop教程,ps教程,flash教程,cad教程,网页制作教程,excel教程,asp教程,vb教程,3d教程,c语言教程,html教程,coreldraw教程,dreamweaver教程,java教程,3dmax教程 等各种教程为主题的内容和服务,相信您会在这里找到您所需要的东东。无师自通伴您一生-谢谢您的光临!!
网站地图 设为首页
简繁切换 加入收藏
栏目待定 留言本站
您现在的位置: 无师自通-教程网 >> WEB开发 >> ASP.NET教程 >> ASP.NET技巧 >> 教程正文

  没有公告

教程: ASP.NET教程-.NET技巧-解决.net开发问题的最终法宝 更多...
教程: ASP.NET教程-.NET技巧-解决.net开发问题的最终法宝
这两天正在网上找工作。昨天一网友问了个问题,说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。

[1] [2] 下一页

教程录入:admin    责任编辑:admin 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
     
     
     

    asp连接mysql数据库

    asp连接mysql数据库-2

    frontpage2000教程---制作主页
    免责声明!本站资料大部分来自于互联网,其版权归原作者或其他合法者所有.如内容涉及或侵犯了您的权益,请通知本人,我将尽快处理!.欢迎您的光临。
    辽ICP备07003958号
    无师自通,伴你一生-教程网