为什么在网上找挽回女朋友失败知乎总是失败,总是遇到骗子?为什么现在骗子这么多

> movewindow api在c#中对应的函数是什么?解决方案
movewindow api在c#中对应的函数是什么?解决方案
shuibian & &
发布时间: & &
浏览:14 & &
回复:3 & &
悬赏:0.0希赛币
movewindow api在c#中对应的函数是什么?c#函数名和windows api为啥不兼容一下啊,
  C# code  From1.Location = new Point(x, y);
shuichangk & &
18:18:31 & &
& & (0)(0)引用  C# code  [DllImport(&user32.dll&,EntryPoint=&MoveWindow&)]
public static extern int MoveWindow(int hwnd, int x, int y, int nWidth, int nHeight, int bRepaint)
shuibode & &
18:18:31 & &
& & (0)(0)引用  C# code  using S
using System.D
using System.Windows.F
using System.Runtime.InteropS
class Form1 : Form
Random rand = new Random();
protected override void OnPaint(PaintEventArgs e)
e.Graphics.DrawString
&单击窗体客户区,\r\n则窗体会随机移动\r\n并改变大小,\r\n很有趣吧!&,
new Font(&Arial&, 16),
new SolidBrush(Color.Blue),
base.OnPaint(e);
[DllImport(&user32.dll&,EntryPoint=&MoveWindow&)]
public static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth, int nHeight, bool bRepaint);
// 这是使用 API 的版本
protected override void OnClick(EventArgs e)
= rand.Next(800);
= rand.Next(600);
int nWidth
= rand.Next(50, 500);
int nHeight = rand.Next(50, 500);
MoveWindow(Handle, x, y, nWidth, nHeight, true);
base.OnClick(e);
// 这是不使用 API 的版本
protected override void OnClick(EventArgs e)
= rand.Next(800);
= rand.Next(600);
= rand.Next(50, 500);
Height = rand.Next(50, 500);
base.OnClick(e);
static void Main()
Application.Run(new Form1());
}shuibing1113 & &
18:18:31 & &
& & (0)(0)引用
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&VixVMware API函数出错解决方案 - Windows当前位置:& &&&VixVMware API函数出错解决方案VixVMware API函数出错解决方案&&网友分享于:&&浏览:54次VixVMware API函数出错程序如下: &
VixHandle hostHandle = VIX_INVALID_HANDLE; &
VixHandle jobHandle = VIX_INVALID_HANDLE; &
VixHandle vmHandle = VIX_INVALID_HANDLE;
VixHandle powHandle = VIX_INVALID_HANDLE;
VixHandle loginHandle = VIX_INVALID_HANDLE;
jobHandle = VixHost_Connect(VIX_API_VERSION, VIX_SERVICEPROVIDER_VMWARE_WORKSTATION, NULL, 0, NULL, NULL, 0, VIX_INVALID_HANDLE,
NULL, NULL);
VixError err = VixJob_Wait(jobHandle, VIX_PROPERTY_JOB_RESULT_HANDLE, &hostHandle, VIX_PROPERTY_NONE);
if (VIX_OK != err)
Vix_ReleaseHandle(jobHandle); &
jobHandle = VIX_INVALID_HANDLE;&
jobHandle = VixVM_Open(hostHandle, &F:\\vmware\\Windows 7.vmx&, NULL, NULL);
err = VixJob_Wait(jobHandle, VIX_PROPERTY_JOB_RESULT_HANDLE, &vmHandle, VIX_PROPERTY_NONE);
if(VIX_OK != err)
Vix_ReleaseHandle(jobHandle); &
jobHandle = VIX_INVALID_HANDLE;&
jobHandle = VixVM_PowerOn(vmHandle,
0, VIX_INVALID_HANDLE, NULL, NULL);
err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
if(VIX_OK != err)
Vix_ReleaseHandle(jobHandle);
jobHandle = VixVM_WaitForToolsInGuest(vmHandle, 300, NULL, NULL);
err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
if(VIX_OK != err)
Vix_ReleaseHandle(jobHandle);
jobHandle = VixVM_LoginInGuest(vmHandle, &123456&, &123456&, 0, NULL, NULL);
err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
if(VIX_OK != err)
} &VixVM_LoginInGuest函数失败,错误代码为3015.求指教.------解决方案--------------------
我之间也出现过这样的错误,那时候我虚拟机的操作系统是Win7,后来改成XP就可以了,希望能帮到你...
------解决方案--------------------会是字符的问题吗?API一般使用Unicode字符!如:VixVM_CopyFileFromHostToGuest(vmHandle, (char*)lpFile ,&C:\\1.exe&, 0, VIX_INVALID_HANDLE, NULL, NULL);改为:VixVM_CopyFileFromHostToGuest(vmHandle, (char*)lpFile ,L&C:\\1.exe&, 0, VIX_INVALID_HANDLE, NULL, NULL);
------解决方案-------------------- 错误27是VIX_E_INVALID_UTF8_STRING,出现这个错误是因为路径里面出现了中文...
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
笑解 API 函数 -- API 绝密档案系列之三
关键字:API 技巧
  在这一篇中,我们首先简单介绍另一个函数 GetProcAddress, GetProcAddress 和 GetModuleHandle 函数是的关系,我个人认为这两个函数的命名非常容易让用户产生混乱,而且有些颠倒的感觉,似乎如下命名更好:
  将 GetModuleHandle 改为
  GetProcBaseAddress //GetModuleHandle 实质是获取进程加载的基地址
  将 GetProcAddress 改为
  GetFunctionAddress //GetProcAddress 实质是获取函数的调用地址
  不过老盖是老大,老大喜欢将太阳叫成月亮,你只能跟着喊“月亮(太阳)升起来咯,喜洋洋咯赫唉,挑起扁担啷当彩......"。
  Windows进入2K时代,开始全面支持Unicode编码方式,我们从GetModuleHandle的分析中已经看到。说起Unicode,不得不提一句,Unicode编码方式对C语言来说,简直就是悲剧。大家都知道 C 格式的字符串是以0x0作为终止符号的。即有如下表示形式:
  db "GetProcAddress",0
  在内存中的映象为:
  47 65 74 50 72 6F 63 41 64 64 72 65 73 73 00
  如果是Uncode在内存中的映象为:
  47 00 65 00 74 00 50 00 72 00 6F 00 63 00 41 00 64 00 64 00 72 00 65 00 73 00 73 00
  哈哈, C 格式的字符串王朝一瞬间就灰飞烟灭了。
  如果你留心就会发现,Win2K以后版本的函数凡是涉及字符串的基本都有 A 和 W 的区分,但这个 GetProcAddress 就没有 A 和 W 的区分,即没有 GetProcAddressA 和 GetProcAddressW,为什么呢?其实就是上面的原因,C 编译器生成的程序输出表都是以 C 格式字符串来表示函数名,GetProcAddress 是如何获得函数的调用地址的?就是利用输出表,所以就没有那个 A 和 W 了,哈哈,真有意思。
  说了半天废话,言归正传,GetProcAddress 的代码如下:
  77E80CAB ; Exported entry 344. GetProcAddress
  77E80CAB ; ======== S U B R O U T I N E ====================
  77E80CAB ; FARPROC __stdcall GetProcAddress(HMODULE hModule,LPCSTR lpProcName)
  77E80CAB public _GetProcAddress@8
  77E80CAB _GetProcAddress@8 proc near
  77E80CAB ProcNameString= dword ptr -8
  77E80CAB hModule= dword ptr 8
  77E80CAB lpProcName= dword ptr 0Ch
  77E80CAB push ebp
  77E80CAC mov ebp, esp
  77E80CAE push ecx
  77E80CAF push ecx
  77E80CB0 push ebx
  77E80CB1 push edi
  77E80CB2 mov edi, [ebp+lpProcName] ; 获取指向函数名的指针(地址)
  77E80CB5 mov ebx, 0FFFFh
  77E80CBA cmp edi, 如果lpProcName是字符串,这指向这个字符串的地址一定
  77E80CBA ; 大于 0FFFFh
  77E80CBC jbe short IfProcNameIsNull
  77E80CBE lea eax, [ebp+ProcNameString]
  77E80CC1 SourceString
  77E80CC2 DestinationString
  77E80CC3 call ds:__imp__RtlInitString@8 ; __declspec(dllimport) RtlInitString(x,x)
  77E80CC9 lea eax, [ebp+lpProcName] ; 将 lpProcName 作为变量使用
  77E80CCC ProcedureAddress
  77E80CCD lea eax, [ebp+ProcNameString]
  77E80CD0 push 0 ; Ordinal
  77E80CD2 Name
  77E80CD3 jmp short GetProcAddress
  77E80CD5 IfProcNameIsNull:
  77E80CD5 lea eax, [ebp+lpProcName]
  77E80CD8 ProcedureAddress
  77E80CD9 Ordinal
  77E80CDA push 0 ; Name
  77E80CDC GetProcAddress: ; flag
  77E80CDC push 0
  77E80CDE push [ebp+hModule] ; hModule
  77E80CE1 call _BasepMapModuleHandle@8 ; BasepMapModuleHandle(x,x)
  77E80CE6 BaseAddress
  77E80CE7 call _LdrGetProcedureAddress@16 ; LdrGetProcedureAddress(x,x,x,x)
  77E80CEC test eax, eax
  77E80CEE jl short IfFunAddrEquZero
  77E80CF0 push 0 ; flag
  77E80CF2 push [ebp+hModule] ; hModule
  77E80CF5 call _BasepMapModuleHandle@8 ; BasepMapModuleHandle(x,x)
  77E80CFA cmp [ebp+lpProcName], eax
  77E80CFD jnz short IfFunAddrIsOk
  77E80CFF cmp ebx, edi
  77E80D01 sbb eax, eax
  77E80D03 neg eax
  77E80D05 add eax, STATUS_ORDINAL_NOT_FOUND
  77E80D0A IfFunAddrEquZero:
  77E80D0A Status
  77E80D0B call _BaseSetLastNTError@4 ; BaseSetLastNTError(x)
  77E80D10 xor eax, eax
  77E80D12 jmp short Exit
  77E80D14 IfFunAddrIsOk: ; 变量参数lpProcName的内容为 ProcAddress
  77E80D14 mov eax, [ebp+lpProcName] ; 变量参数lpProcName的内容为 ProcAddress
  77E80D17 Exit:
  77E80D17 pop edi
  77E80D18 pop ebx
  77E80D19 leave
  77E80D1A retn 8
  77E80D1A _GetProcAddress@8 endp
  77E68210 ; ======== S U B R O U T I N E ====================
  77E68210 ; int __stdcall BasepMapModuleHandle(HMODULE hModule,BOOLEAN flag)
  77E68210 _BasepMapModuleHandle@8 proc near
  77E68210 hModule= dword ptr 8
  77E68210 flag = byte ptr 0Ch
  77E68210 push ebp
  77E68211 mov ebp, esp
  77E68213 mov eax, [ebp+hModule]
  77E68216 test eax, eax
  77E68218 jz short loc_77E68229
  77E6821A test al, 1
  77E6821C jz short loc_77E68235
  77E6821E ;if flag == 0
  77E6821E ; ecx = 0
  77E6821E ;else
  77E6821E ; ecx = 0xFFFFFFFF
  77E6821E mov cl, [ebp+flag]
  77E68221 neg cl
  77E68223 sbb ecx, ecx
  77E68225 and eax, ecx
  77E68227 jmp short loc_77E68235
  77E68229 loc_77E68229:
  77E68229 mov eax, large:18h
  77E6822F mov eax, [eax+TEB.Peb]
  77E68232 mov eax, [eax+PEB.ImageBaseAddress]
  77E68235 loc_77E68235:
  77E68235 pop ebp
  77E68236 retn 8
  77E68236 _BasepMapModuleHandle@8 endp
  我们来简单的分析一下这段代码,首先我们老盖对参数lpProcName的解释(英文不好的朋友可以参考qduwg 老师的翻译)
  lpProcName
  Pointer to a null-terminated string containing the function name, or specifies the function’s ordinal value. If this parameter is an ordinal value, it must be in the low- the high-order word must be zero.
  变参 lpProcName 即可以是函数的名称,也可以是函数的序号,这里说明一下,在你的开发中,千万不要使用函数的序号,这个功能其实是老盖的专用,因为 Updata 或升级将导致函数的序号发生变换,你的程序立刻就可能彻底完蛋,你只有使用函数名字。其实这个参数还有一个功能,就是返回函数的调用地址,和EAX中返回的相同。
  函数的头部首先判断参数是什么性质,字符串还是序号:
  77E80CB2 mov edi, [ebp+lpProcName] ; 获取指向函数名的指针(地址)
  77E80CB5 mov ebx, 0FFFFh
  77E80CBA cmp edi, 如果lpProcName是字符串,这指向这个字符串的地址一定
  77E80CBA ; 大于 0FFFFh
  77E80CBC jbe short IfProcNameIsNull
  1.如果是字符串
  如果是字符串,首先调用 RtlInitString:
  77E80CBE lea eax, [ebp+ProcNameString]
  77E80CC1 SourceString
  77E80CC2 DestinationString
  77E80CC3 call ds:__imp__RtlInitString@8 ; __declspec(dllimport) RtlInitString(x,x)
  ;下面是为调用 LdrGetProcedureAddress(x,x,x,x) 而设置入口参数
  77E80CC9 lea eax, [ebp+lpProcName] ; 将 lpProcName 作为变量使用
  77E80CCC ProcedureAddress
  77E80CCD lea eax, [ebp+ProcNameString]
  77E80CD0 push 0 ; Ordinal
  77E80CD2 Name
  77E80CD3 jmp short GetProcA 跳到获取函数地址的具体调用
  这里补充说明上一篇的一个类似的函数 RtlInitUnicodeString,我们首先来看两个结构:
  UNICODE_STRING (sizeof=0X8, standard type)
  Length dw ?
  MaximumLength dw ?
  Buffer dd ? ;指向字符串的指针
  UNICODE_STRING ends
  STRING (sizeof=0X8)
  Length dw ?
  MaximumLength dw ?
  Buffer dd ? ;指向字符串的指针
  STRING ends
  所谓初始化字符串,其实就是构造这样一个结构,将Length中填上字符串的长度,将MaximumLength中填上字符串允许的最大长度,Buffer中填上指向字符串的地址。我不知老盖是怎样思维的,这里字符串的长度单位使用 Word ,明显没有战略眼光,限制了字符串的最大长度,局限了字符串的使用功能。我们来看看 Borland 的工程师们是怎样定义字符串的。
   (sizeof=0X8, variable size)
  top dd ?
  Len dd ?
  Text db 0 dup(?) ; string(C)
  strings ends
  其中top中为 0FFFFFFFFh,表示此字符串已经初始化,也是字符串的标志。Len字符串的长度,单位是 DWORD,最后是一个不定长的字符串,以零结尾,但在Delphi中操作字符串,实际是以Len来实现,并不关心字符串中是否有 0,这个 0 是用来兼容 C 字符串的,如果要把Delphi的字符串当作 C 字符串来使用,这个 0 就不能乱放了。由于使用 DWORD 来定义字符串的长度,所以 Delphi 中字符串的操作远比我们想象的要来得强大,在 Delphi 中你可以将整个文件读入一个字符串中(包括一个可执行文件),然后用字符串指针去随意操作,所有字符串的函数使用,比使用流更方便。这就是被称为巨型字符串的东西了。字符串的长度在32位系统只和内存的大小有关,即 DWORD 的 寻址空间,Borland 的工程师给出一个比较的数值,小于2G,防止字符串覆盖了老盖的操作系统,哈哈。
  2.如果是序号
  序号的处理比较简单,直接拿过来使用就完了。
  77E80CD5 IfProcNameIsNull:
  ;下面是为调用 LdrGetProcedureAddress(x,x,x,x) 而设置入口参数
  77E80CD5 lea eax, [ebp+lpProcName]
  77E80CD8 ProcedureAddress
  77E80CD9 Ordinal
  77E80CDA push 0 ; Name
  3.获取函数调用地址
  作为系统操作,首要考虑的就是运行稳定、强壮,这里调用 BasepMapModuleHandle 基本就是起这个作用,如果打造自己的API 函数,就没有必要怎样复杂了。
  77E80CDC GetProcAddress: ; flag
  77E80CDC push 0
  77E80CDE push [ebp+hModule] ; hModule
  77E80CE1 call _BasepMapModuleHandle@8 ; 检查 hModule 的合法性
  77E80CE6 BaseAddress
  77E80CE7 call _LdrGetProcedureAddress@16 ; LdrGetProcedureAddress(x,x,x,x)
  77E80CEC test eax, eax
  77E80CEE jl short IfFunAddrEquZero
  77E80CF0 push 0 ; flag
  77E80CF2 push [ebp+hModule] ; hModule
  77E80CF5 call _BasepMapModuleHandle@8 ; 检查函数调用地址的合法性
  77E80CFA cmp [ebp+lpProcName], eax
  77E80CFD jnz short IfFunAddrIsOk
  77E80CFF cmp ebx, edi
  77E80D01 sbb eax, eax
  77E80D03 neg eax
  77E80D05 add eax, STATUS_ORDINAL_NOT_FOUND
  77E80D0A IfFunAddrEquZero: ; Status
  77E80D0A push eax
  77E80D0B call _BaseSetLastNTError@4 ; BaseSetLastNTError(x)
  77E80D10 xor eax, eax
  77E80D12 jmp short Exit
  不管lpProcName变参是函数名还是序号,最后都是调用位于ntdll.dll中的 LdrGetProcedureAddress ,这个函数的过程也是很复杂的,但主要工作就是通过输出表来获得函数调用地址,我们只列出相应部分的代码,这部分代码在一个叫着 LdrpSnapThunk 的子过程中。
  我不知大家对这个函数名有什么看法,你能从函数的命名上猜出这个函数做了 Get Function 的工作吗?如果你能,你的智商肯定超过爱因斯坦,将来没准给我们弄出一个什么“背对论”来。昨天为了这个函数名,我请教了我们那位密码语言天才伊万大叔。将我对 LdrSnapThunk 的译文“调遣一部带有巨大象鼻吸盘新型设备,用外形似象鼻子的那么一个吸盘吸住一根将要打到树上的大铁棍”,告诉伊万大叔,多么富有诗意的名字。当我正在为我伟大的翻译和理解而沾沾自喜的时候,伊万大叔大吼一声:“错,你知道老盖生活在什么地方吗?”,我想,我还没有愚蠢到连老盖先生住在那里都不知道的地步。伊万大叔接着说:“你知道那里是什么文化最出名吗?,那就是多元文化,写这段程序的先生没准来自于爪哇(Java)国,你知道 Java 吗?”,我答:“这个知道,不就是能让很多黄色下流的东西流入每个家庭的一种下流语言吗”。伊万大叔微笑道:“孺子可教也,在爪哇国,LdrpSnapThunk 的就是 Get Function Address,明白了吗,就象我弄一个俄文名字,然后用英文对应的字母写出,你能看懂吗,哈哈”。哇赛!,天才就是不同,连这都解的出,可惜天下父母要倒霉了,“背对论”所要研究的就是当一个男孩和一个女孩背对背靠在一起是,时空所发生的变化。
  马掌钉在膝盖上,唉! 离蹄(题)太远了,打住。
[ 责任编辑:于捷 ]
去年,手机江湖里的竞争格局还是…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte

我要回帖

更多关于 遇到失败不自卑的名人 的文章

 

随机推荐