VFP调用Windows API函数

合集下载

WindowsAPI常用函数

WindowsAPI常用函数

WindowsAPI常⽤函数.Net中虽然类库很强的,但还是有些时候功能有限,掌握常⽤的api函数,会给我们解决问题提供另⼀种思路,下⾯给出⾃⼰常⽤到的Api函数,以备查询。

1,SetForegroundWindow将窗⼝显⽰到最前⾯,前提是窗⼝没有最⼩化。

[DllImport("User32.dll")]public static extern bool SetForegroundWindow(IntPtr hWnd);2,ShowWindowAsync显⽰窗⼝,如最⼩化后显⽰正常,这是异步的。

[DllImport("User32.dll")]public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);public enum ShowState : int{SW_HIDE = 0,SW_SHOWNORMAL = 1,SW_NORMAL = 1,SW_SHOWMINIMIZED = 2,SW_SHOWMAXIMIZED = 3,SW_MAXIMIZE = 3,SW_SHOWNOACTIVATE = 4,SW_SHOW = 5,SW_MINIMIZE = 6,SW_SHOWMINNOACTIVE = 7,SW_SHOWNA = 8,SW_RESTORE = 9,SW_SHOWDEFAULT = 10,SW_FORCEMINIMIZE = 11,SW_MAX = 11}3,SendMessage进程间通信,接受窗⼝要有消息循环才⾏。

WM_COPYDATApublic const int WM_COPYDATA = 0x004A;public struct COPYDATASTRUCT{public IntPtr dwData;public int cbData;[MarshalAs(UnmanagedType.LPStr)]public string lpData;}[DllImport("User32.dll", EntryPoint = "SendMessage")]public static extern int SendMessage(IntPtr hWnd, // handle to destination windowint Msg, // messageint wParam, // first message parameterref COPYDATASTRUCT lParam // second message parameter);例⼦:发送⽅:byte[] sarr = System.Text.Encoding.Default.GetBytes(args[0]);Winn32.COPYDATASTRUCT copyData = new Winn32.COPYDATASTRUCT();copyData.cbData = sarr.Length + 1;copyData.lpData = args[0];copyData.dwData = (IntPtr)100; //这⾥随便写什么数字Winn32.SendMessage(runningInstance.MainWindowHandle, Winn32.WM_COPYDATA, 0, ref copyData);接收⽅protected override void DefWndProc(ref Message m){if (m.Msg == Winn32.WM_COPYDATA){Winn32.COPYDATASTRUCT copyData = new Winn32.COPYDATASTRUCT();Type type = copyData.GetType();copyData = (Winn32.COPYDATASTRUCT)m.GetLParam(type);this.textBox1.Text = copyData.lpData;}base.DefWndProc(ref m);}4,FindWindow找到窗⼝句柄[DllImport("User32.dll", EntryPoint = "FindWindow")]private static extern int FindWindow(string lpClassName, string lpWindowName);5,SetLocalTime设定系统时间[StructLayout(LayoutKind.Sequential)]public struct SYSTEMTIME{public ushort wYear;public ushort wMonth;public ushort wDayOfWeek;public ushort wDay;public ushort wHour;public ushort wMinute;public ushort wSecond;public ushort wMilliseconds;public void FromDateTime(DateTime dateTime){wYear = (ushort)dateTime.Year;wMonth = (ushort)dateTime.Month;wDayOfWeek = (ushort)dateTime.DayOfWeek;wDay = (ushort)dateTime.Day;wHour = (ushort)dateTime.Hour;wMinute = (ushort)dateTime.Minute;wSecond = (ushort)dateTime.Second;wMilliseconds = (ushort)lisecond;}public DateTime ToDateTime(){return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond); }}[DllImport("kernel32.dll")]public static extern bool SetLocalTime(ref SYSTEMTIME Time);6,SHGetFileInfo获取执⾏⽂件的图标icon[Flags]enum SHGFI : int{/// <summary>get icon</summary>Icon = 0x000000100,/// <summary>get display name</summary>DisplayName = 0x000000200,/// <summary>get type name</summary>TypeName = 0x000000400,/// <summary>get attributes</summary>Attributes = 0x000000800,/// <summary>get icon location</summary>IconLocation = 0x000001000,/// <summary>return exe type</summary>ExeType = 0x000002000,/// <summary>get system icon index</summary>SysIconIndex = 0x000004000,/// <summary>put a link overlay on icon</summary>LinkOverlay = 0x000008000,/// <summary>show icon in selected state</summary>Selected = 0x000010000,/// <summary>get only specified attributes</summary>Attr_Specified = 0x000020000,/// <summary>get large icon</summary>LargeIcon = 0x000000000,/// <summary>get small icon</summary>SmallIcon = 0x000000001,/// <summary>get open icon</summary>OpenIcon = 0x000000002,/// <summary>get shell size icon</summary>ShellIconSize = 0x000000004,/// <summary>pszPath is a pidl</summary>PIDL = 0x000000008,/// <summary>use passed dwFileAttribute</summary>UseFileAttributes = 0x000000010,/// <summary>apply the appropriate overlays</summary>AddOverlays = 0x000000020,/// <summary>Get the index of the overlay in the upper 8 bits of the iIcon</summary> OverlayIndex = 0x000000040,}[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]public struct SHFILEINFO{public SHFILEINFO(bool b){hIcon = IntPtr.Zero;iIcon = 0;dwAttributes = 0;szDisplayName = "";szTypeName = "";}public IntPtr hIcon;public int iIcon;public uint dwAttributes;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]public string szDisplayName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]public string szTypeName;};[DllImport("shell32.dll", CharSet = CharSet.Unicode)]//路径有中⽂字符,要⽤unicodepublic static extern int SHGetFileInfo(string pszPath,int dwFileAttributes,out SHFILEINFO psfi,uint cbfileInfo,SHGFI uFlags);例⼦:private static Icon GetIcon(string strPath, bool bSmall){SHFILEINFO info = new SHFILEINFO(true);int cbFileInfo = Marshal.SizeOf(info);SHGFI flags;if (bSmall)flags = SHGFI.Icon | SHGFI.SmallIcon | eFileAttributes;elseflags = SHGFI.Icon | rgeIcon;Win32API.SHGetFileInfo(strPath, 256, out info, (uint)cbFileInfo, flags);return Icon.FromHandle(info.hIcon);}7,GetWindowThreadProcessId得到句柄的进程和线程ID,返回的是线程ID,ref返回的是进程ID[System.Runtime.InteropServices.DllImport("User32.dll")]private static extern int GetWindowThreadProcessId(int Hwnd, ref int OutPressId);例⼦:杀死excel进程int processID = 0;int threadID;threadID = GetWindowThreadProcessId(excelApp.Hwnd, ref processID);if (processID > 0){System.Diagnostics.Process process = System.Diagnostics.Process.GetProcessById(processID); if (process != null){ process.Kill(); }}。

VFP6.0程序设计第10章 Visual FoxPro 6.0 的高级应用

VFP6.0程序设计第10章 Visual FoxPro 6.0 的高级应用

(4)使用数据缓冲技术 在多用户环境下,为了保护数据更新和避免冲突,除了使用自 动加锁和人工加锁外,还可以使用数据缓冲技术。 数据缓冲技术就是当用户启动了数据缓冲,使用共享文件更新 数据时,首先将当前记录复制到一块由Visual FoxPro进行管理的内存 区域或磁盘空间,其它用户仍然可以同时访问原表中的记录。当需 要更新时,确认其它用户没有进行修改,才可编辑修改结果。如果 检测到冲突,系统将提示出错信息。数据缓冲一旦启用,在它被废 止前或关闭表前一直有效。 (1)选择缓冲方法 提供了两种缓冲方法,即记录缓冲和表缓冲。 记录缓冲是指对单个记录的编辑修改进行缓冲。 表缓冲是指把表的多处修改保存到内存中,当关闭表或调用表 更新函数时,才对数据进行更新。
10.2
多用户与共享技术
10.2.1 多用户环境下的数据访问技术 10.2.2 数据更新技术 10.2.3 对访问冲突的处理
10.2..1
多用户环境下的数据访问技术
1. 独占或共享的访问控制 独占就是只有一个用户独自使用资源,而共享就是多个用户共 同使用某资源。在共享环境下,可以有两种方式访问数据:独占式 访问或共享式访问。若以独占式打开表,用户不必考虑加锁问题而 可以进行读写操作,但是其它用户不能打开该表。在Visual FoxPro 中通过界面打开表时,在默认情况下就是使用独占方式。另外,在 Visual FoxPro 中可以明确地说明一个表以独占方式打开,从而防止 其它用户同时使用该表。如果显式说明采用独占方式,使用的命令 是:
SET EXCLUSIVE ON USE 表名 有些命令在执行时,要求表必须以独占方式打开,这几个命令 分别是: ALTER TABLE 、INDEX、INSERT、MODIFY、 STRUCTURE、 PACK、REINDEX、ZIP 如果需要以共享方式打开某个表,也需要在命令窗口或在程序 中显式地说明,具体的命令格式是: USE 表名 SHARED 在打开表时加上关键词SHARED则表示以共享方式打开表,这 样,多个用户可以同时访问该表。 2. 数据的加锁 所谓的加锁,就是给所要操作的数据加上一定的限制;解锁就 是取消给数据所加的限制,它是加锁的逆过程。

VBA中的API接口交互实现步骤

VBA中的API接口交互实现步骤

VBA中的API接口交互实现步骤VBA(Visual Basic for Applications)是一种用于自动化操作Microsoft Office应用程序的编程语言。

在VBA中,可以通过API (Application Programming Interface)接口与其他应用程序进行交互,以实现数据的传递和操作。

本文将介绍VBA中实现API接口交互的步骤,助你更好地理解和应用这一功能。

步骤一:了解API接口API接口是用于应用程序之间通信的一种标准化协议。

在VBA 中,可以利用API接口与其他应用程序进行数据传递和操作,如获取数据、发送请求、执行命令等。

在开始编写VBA代码之前,你需要先了解所要使用的API接口的相关信息,包括接口的名称、方法和参数等。

步骤二:引入Windows API声明在VBA中,需要使用Declare语句来引入Windows API声明,以便使用API接口。

Windows API声明包含了一组函数、类型和常量的定义,用于与操作系统进行交互。

可以通过在VBA代码中使用Declare语句来引入所需的API声明,如下所示:```vbaDeclare Function 函数名 Lib "库名称" (参数列表) As 返回值类型```其中,函数名表示API接口的函数名称,库名称表示包含这个函数的DLL文件名称,参数列表和返回值类型表示函数的参数和返回值类型。

步骤三:调用API接口函数在引入了API声明后,可以在VBA代码中直接调用API接口函数。

调用API接口函数的方式与调用其他VBA函数类似,使用函数名和参数列表来进行调用。

例如:```vbaDim 返回值 As 返回值类型返回值 = 函数名(参数)```这样就可以利用API接口函数实现特定的功能,如获取数据、发送网络请求等。

步骤四:处理返回值调用API接口函数后,通常会返回一个值或者一个对象。

在接收到返回值后,你可以根据需要进行相应的处理,如将返回值赋给一个变量、将返回的数据进行解析等。

VBA中调用API函数的方法和技巧

VBA中调用API函数的方法和技巧

VBA中调用API函数的方法和技巧VBA(Visual Basic for Applications)是一种用于微软Office应用程序的编程语言,它提供了许多强大的功能和工具,可以增强Office程序的自动化和扩展性。

在VBA中,调用API函数是一种常见的方式,可以让我们使用计算机系统提供的底层功能,以实现更高级的操作。

本文将介绍VBA中调用API函数的方法和技巧,以帮助您更好地使用VBA进行编程。

1. 了解API函数的基本概念API(Application Programming Interface)是一组定义了程序之间交互方式的规范。

通过调用API函数,我们可以利用操作系统或其他程序提供的功能,而无需自己编写底层代码。

VBA中的API函数是以动态链接库(DLL)的形式提供的,这些DLL文件通常包含了许多函数和过程,可以供我们进行调用。

2. 查找所需的API函数在VBA中调用API函数之前,我们需要先找到需要使用的API函数及其所属的DLL文件。

可以通过以下几种方式来查找:- 在Microsoft的官方文档中查找:Microsoft提供了许多API函数的文档,可以在其网站上找到对应的函数说明和示例代码。

- 在互联网上搜索:许多技术论坛和网站都提供了关于API函数的使用方法和示例代码。

可以通过搜索引擎来寻找相关的资源。

- 使用API查找工具:有一些第三方工具可以帮助我们查找API函数及其所属的DLL文件。

例如,Dependency Walker是一个常用的工具,可以查看DLL文件中包含的函数和模块。

3. 声明API函数在VBA中调用API函数之前,我们需要先声明这些函数,以告诉编译器它们的名称、参数和返回值的类型。

声明API函数的语法如下:```vbaPrivate Declare Function 函数名 Lib "DLL文件名" (参数列表) As 返回值类型```其中,函数名是API函数的名称,DLL文件名是包含该函数的DLL文件的名称,参数列表是函数的参数及其类型,返回值类型是函数的返回值类型。

VB_API调用,实现获取窗口信息

VB_API调用,实现获取窗口信息

VB_API调⽤,实现获取窗⼝信息VB编程:浅谈API的应⽤——实现获取⽬标窗⼝的信息1.第⼀部分废话不说,先把⼏个⽤到的API声明源码发出来,我是在“模块”⾥声明的Option ExplicitDeclare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long '窗⼝置顶Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long '捕获⿏标所在窗⼝信息Declare Function ReleaseCapture Lib "user32" () As Long ' 与setcapture对应Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long '返回⿏标所在窗⼝的句柄Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long '坐标转化Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long '获取指定窗⼝类名Public Type POINTAPIX As LongY As LongEnd Type⼤家看到了,这⾥我⽤到了6个API,每个API声明的后⾯我都把它的功能注释出来了。

win32api的使用方法

win32api的使用方法

win32api的使用方法
win32api的使用方法主要包括以下几种:
1. 调用win32api函数,如GetCursorPos()函数获取光标位置。

具体地,需要在代码中声明一个POINT结构体,然后使用DllImport属性导入动态链接库,最后调用GetCursorPos()函数并将返回的光标位置赋值给POINT 结构体中的X和Y属性。

2. 使用invoke语句调用API函数。

在MASM汇编语言中,可以使用invoke语句来调用API函数,并指定函数的参数。

编译器会检查参数的数量和类型是否正确,如果参数少了或者类型不匹配,会报错。

3. 在调用API函数之前,需要先声明该函数。

声明的格式包括函数名、原型、距离、语言和参数列表,其中参数列表包括每个参数的名称、数据类型和修饰符。

需要注意的是,win32api的使用需要一定的编程基础和经验,因此在学习使用win32api之前,建议先学习相关的编程语言和基础知识。

同时,win32api的使用也需要考虑到操作系统的版本和位数,不同的操作系统版本和位数可能会对API函数的可用性和行为产生影响。

因此,在使用
win32api时,需要注意选择正确的API函数并了解其用法和限制。

VFP 帮助中的FLL资料

一、将参数传递到Visual FoxPro API 函数 (1)二、如何从ActiveX 控件和FLL 库返回值 (2)三、外部库的参数 (4)四、创建Visual FoxPro 动态链接库 (8)五、访问Visual FoxPro 的变量和字段 (9)六、用Visual FoxPro API 管理内存 (10)七、如何管理内存 (10)八、FoxInfo 结构 (12)一、将参数传递到Visual FoxPro API 函数Visual FoxPro API 例程常常需要特定Visual FoxPro 数据结构的参数。

下列部分提供了Visual FoxPro 数据类型和附加数据结构的列表。

有关实际的类型定义和结构定义,参考文件。

Visual FoxPro API 数据类型下列数据类型可用于Visual FoxPro API 例程。

数据类型说明EDLINE编辑窗口中打开文件中的行号。

第一行是1。

EDPOS编辑窗口中打开文件中字符的偏移位置。

该文件或备注文件中第一个字符的偏移位置是0。

FCHAN文件通道。

每个由Visual FoxPro 或使用_FCreate( ) 和_FOpen( ) 通过API 打开的文件都被指派一个FCHAN。

FPFI指向返回整数值函数的32 位指针。

ITEMID指派给菜单上单个命令的唯一标识符。

MENUID指派给菜单的唯一标识符。

MHANDLE给予每个由Visual FoxPro 或使用_AllocHand( ) 通过API 分配的内存块的唯一标识符。

可以使用_HandToPtr( ) 放弃对指针的引用。

NTI 命名表索引。

每个变量和表字段名都拥有该表中的一项。

WHANDLE窗口句柄。

指派给由Visual FoxPro 或使用_WOpen( ) 通过API 打开窗口的唯一标识符。

注意:由于FAR 指针不适合于32 位编译器,中的#define 语句将FAR、_far 和__far 重新定义为null 值。

VB6中API函数的使用

VB6中API函数的使用
一、什么是API函数
API(应用程序编程接口)函数是操作系统提供的一组函数,提供给
其它程序调用。

API允许软件开发者在调用接口时要求操作系统完成项工作。

二、Visual Basic6中使用API函数
Visual Basic6中使用API函数的方法有三种,它们分别是:
1.使用VBApi模块
VBApi模块可以帮助你实现API函数的调用。

它可以用在任何类型的
应用程序中,并且它可以用来调用任何的API函数,只需要在Visual Basic6中添加一个VBApi模块即可,添加方式如下:
2.使用Declare语句
Declare定义是用来定义Visual Basic程序和外部函数或DLL文件
中的特殊函数的语句。

[Public , Private][Static] Declare FunctionName AliasAliasname Lib"PathName"[(AsReturnType]
3.使用DLL
使用DLL是比使用VBApi模块和Declare语句更高级的API函数调用
方式,它可以大大简化调用过程。

在使用DLL之前,需要先配置DLL文件,具体步骤如下:
(1)将需要调用的DLL文件添加到Visual Basic的References中,这样Visual Basic就可以调用该DLL文件中的函数。

(2)添加Win32API模块,使用此模块可定义API函数的参数。

VB API函数大全

列举安装在计算机里的所有ocx控件
Returning an ExitCode parameter from an out of process application
从外部应用程序返回参数
Check if a loggin password and user name are correct
检查当前登录的密码和用户名是不是正确的。
Creating new threads to perform asynchronous tasks
创建一个新的线程执行异步任务
Get and set volume information for a drive
得到和设定驱动器的卷信息
Using the ShellExecute API to send mails and print documents
Show the "File Open" Common Dialog
显示“文件打开”对话框
Converting Class IDs to a Prog IDs and back
转变class ID到一个prog ID
Obtaining the current user name
获得当前用户名
Return the path of the temporary directory
给窗体加上定制的系统菜单
Register Components without using Regsvr32.exe
不使用Regsvr32.exe注册组件
Uncover internal DLL functions with Dependency Walker
公布内部调用的dll函数
Launch a PCs default browser with ShellExecute API

C++Builder应用程序中Win32 API函数的调用

C++Builder应用程序中Win32 API函数的调用
杨秋芬
【期刊名称】《计算机时代》
【年(卷),期】2001(000)002
【摘要】@@ Win32 API是Windows 95及Windows NT提供的应用程序设计接口(Application ProgrammingInterface),按功能一般可以分为以下几项:打印功能(Printing)、进程与线程(Processand head)、通讯功能(Communications)、动态链结库(DLL)、安全运行(Security)、内存管理(Memory Management)、系统信息(System Information)、窗口控制(Windows Control)、文件管理(File Management)、网络功能(Networkfunction)、画图组件(Graphics Primitives).【总页数】2页(P18-19)
【作者】杨秋芬
【作者单位】湖南广播电视大学,410008
【正文语种】中文
【相关文献】
1.Visual Fortran调用Win32 API函数 [J], 任慧;周振红
2.在VFP中调用WIN32API函数 [J], 方斌;周金凤
3.在应用程序中调用API函数动态配置ODBC数据源 [J], 郝放
4.Windows应用程序开发中若干重要API函数的调用 [J], 陈健
5.Win32 Api函数的重要作用及调用 [J], 隋永朋;魏振钢
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VFP调用Windows API函数正式开始:我想你可能经常看过如下这种语句,我不得不在这里重复地说一遍DECLARE INTEGER SetWindowText IN user32;INTEGER hWnd,;STRING lpStringHwnd=thisform.hwndcustomtext=space(250)lnlen=len(customtext)SetWindowText(Hwnd,customtext, lnlen)第一个语句就是一般的api定义,意思就是注册一个user32.dll动态库中的函数SetWindowText ,接受参数integer类型hwnd, string 类型h的sWindowText 参数,,返回值为intger ,这是参数按值传递的一部分,第三个语句就是调用注册的api函数了,看起来和我们用普通的foxpro函数并无区别,只是多了一步注册的步骤.我们再看看另一种定义,按引用传递的的方式,看到什么不同了吗?第一个语句就是一般的api定义,意思就是注册一个user32.dll动态库中的函数SetWindowText ,接受的参数是integer类型hwnd, string 类型h的sWindowText , INTEGER 类型的cch,返回值为intger类型DECLARE INTEGER GetWindowText IN user32;INTEGER hwnd,;STRING @lpString,;INTEGER cchHwnd=thisform.hwndHwnd=thisform.hwndStext =space(250)lnlen=250SetWindowText(Hwnd,@customtext, lnlen)没错,多了一个伊妹儿的符号:@,注意调用的时候也得加入该符号,此符号的意思是说参数sWidowText是按引用传递的,为什么要这么用呢,原因是我们要用函数GetwindowText 的得到一个窗体(Form)标题.GetwindowText 的职责就是将我们要的值填入sWidowText中,如果调用成功你就会看到sWidowText的值已经改变.此处你要明白所谓的按引用传递有如C中的指针,我们只是该内容的地址为参数传给GetwindowText,它直接在地址指向的内存单元上修改数据.所以我们才可能看到sWidowText值在调用GetwindowText()函数就发生了改变。

以上两种就是最基本的windows api定义了.对于简单的函数一般都可以这样解决.也许此时你有疑问,你是在哪里知道这些函数的详细信息的?很好很好,有问题是好的.那么请你打开msdn,什么?你不知道MSDN,我倒..^_^简单而说msdn是涵盖了大量内容的帮助文档,大部分的api在其中都有讲述,有些还有小实例.在这里并不要求你要记住所有windows的api函数,这不可行也不可能,只要知道有它的存在,大概的功能,用时查msdn就可以,更重要的是知道怎么去把它纠出来,然后理解它. 如果你现在没有安装MSDN,我强烈建议你马上下载一个msdn2005.该帮助文档大部分都是E文,你得有点心理准备.键入SetWindowText查询,你就会看到所有相关的函数原型,参数及返回值的解释.此时查询后你看到一些莫名其妙的返回值类型和参数类型.如:DWORD,LPTSTR为什么不是integer,string呢?请听我说,由于window api 是基于c的,而C中有一种叫宏定义的东西,而DWORD,LPTSTR就是一种宏罢了,宏定义时一般以大写出现,只不过是类型的另一种叫法而已再查询DWORD,LPTSTR你就可以看到它们的真面目,DWORD<=>无符号的32位的整型,LPTSTR<=>字符串指针注:<=>符号在此代表等价的意思原来DWORD与integer指的同一种数据类型.这就好比有一天在大街上你可能看到一个漂亮的女孩,很是心动,你可能称她为美女或者天使,但最终美女或天使指向的都是这个女孩,不过就是这个女孩的代名词而已.下面我以C为例说明以不同类型来读取相同内存区域后会得到怎么样的内容,我希望你以内存的角度来看。

这些原理是相通的,和语言无关,只是C来讲比较方便罢了,所以我选择它来让问题简单化.此步将有助于你理解怎么在foxpro处理含有结构参数的一些复杂 API 函数,虽然这一部分比较枯燥,但我还是希望你努力看下去.如果这道坎过了,下来也就容易许多先来看看简单的变量声明:假设你的系统上 int类型占4个字节,int icount=0x11ff; //那么该语句将为你开辟一个四字节的内存空间,假设0x11ff存入内存单元:0x000420000之处,那么内存中是这样的内存地址内存单元的内容0x00420000:0xff0x00420001:0x110x00420002:00x00420003:0如果我们现在定义一个字符串指针指向该区域,会是怎么样的呢?char * cValue= (char *)0x00420000;C中的字符串是以chr(0)结尾的,所以当你用* cValue取值的时候,得到的将是这样一个字符串chr(0xff)+chr(0x11)+chr(0)现在你应该明白,以整数存放后的内存,后以字符串读出会是什么样的.下面再讲以字符串存入后再以32位的整数读取的情况char * sHello="hello world";连chr(0)在内12个字符长,一字节一个字符,也就是12个字节了.在内存里面它到底是怎么样呢?这十二个字符将依次放到内存区域当中,不过他不是放的"H" "E" "L" ....chr(0),而是将每个字符转为ascii码后放入假设以上"hello world"存在内存单元:0x00420000之处,那么hello world在内存中将如下所示:内存地址内存单元的内容0x00420000:"h"的ascii0x00420001:"e"的ascii0x00420002:"l"的ascii0x00420003:"l"的ascii0x00420004:"o"的ascii0x00420005:" "的ascii0x00420006:"w"的ascii0x00420007:"o"的ascii0x00420008:"r"的ascii0x00420009:"l"的ascii0x00420010:"d"的ascii0x00420011:NULL值的ascii,即foxpro中的chr(0)我们现在声明一个int 指针指向0x00420007之处,int * theValue=(int *)0x00420007;而此时0x000420007到0x000420010是"orld",四个内存单元存的分别是0x00420007:"o"的ascii0x00420008:"r"的ascii0x00420009:"l"的ascii0x00420010:"d"的ascii那么我们用*theValue得到的值将是:"d"的ascii向左位移24位+"l"的ascii向左位移16位+"r"的ascii向左位移8位+"o"的ascii所构成的32位整数的值再说一个结构:Struct{int ndvalue;int nJvalue;} testStruct;//size 8 bytetestStruct testResult;testResult.ndvalue=0x11testResult.ndvalue=0x22同样假设testResult结构从内存0x00420000开始,下面就是它在内存存储的样子:内存地址内存单元的内容0x00420000:0x110x00420001:00x00420002:00x00420003:00x00420004:0x220x00420005:00x00420006:00x00420007:00x00420008:0我们同样也可以用字符串,或32位整数,还有其它类型都可以,来访问该段内存,得到你想要的数据,方法和上面的一样,这里我就不再重述了.我举这些例子,是要你明白所谓的整型数据,字符串,结构,只是不同的数据表示方法罢了,在内存中已经存在的数据要以什么表示方式来读取完全取决于你的所需.即便你是以字符串存入的,你也可以将它视为数值读出来,反之亦然.很多api 函数并不是像上面说的函数那么简单,它可能由一些结构组成,抓取一个最简单的示例来说: windows定义了一个名为POINT结构来存放一个座标的信息由有两个分别是32位整型成员组成,如下: Struct{int x;int y;}Point;//size= 8 byte而api 函数GetCursorPos()恰好就是接收POINT这种结构.它的功能是为你填取其中传递过去地址所指向的结构,让你知道当前鼠标的座标.由于我们要得到参数在调用后的结果,我们得用引用的方式传递参数,这个到现在你要知道.可在foxpro里面没结构类型,你是不是有点抱怨了为什么不提供结构.不过没关系,我们还有办法,主要的就是用字符串来开辟内存,然后将该内存区域当作结构来使用,基本就是如此理解,不过中间得进行一些转换,转换的原理就是上面所讲的以不同类型读取相同内存的内容。

下面我再说明首先知道Point结构占八个字节长,由两个四字节的成员组成.那么定义一个长度八个字节的字符串区域,将该区域的地址告诉GetCursorPos, 而GetCursorPos就会对该内存操作,为你老老实实填好它,我们的工作嘛就是将取出来的字符串的值还原成我们想要的成员x和y 的整数值.lcPosition = repl(chr(0),8)lnXCoord = 0lnYCoord = 0GetCursorPos(@lcPosition )LEFT(lcPosition,4) &&就是X的值right(lcPosition,4) &&就是Y的值把原来内存中的内容读成我们想要的32位的整数.请不要说用str()不就可以了.NO,你会这么说,证明你还没看懂我上面说的用不同类型读取相同内存区域的部分,请折回看了再继续.只要将这些字符取ascii,移位后组成一个32位的数值就达到目的.希望到此你已经明白为什么要如此转.虽然FOXpro8以上都提供了ctobin的函数可以达到相同的功能,但这里我们还是自己来写一段函数来实现4字节字符串到到32位整型的转换FUNCTION API_STRTOINT(tcSrcString )RETURN Asc(SUBSTR(tcSrcString, 1,1)) + ;BitLShift(Asc(SUBSTR(tcSrcString, 2,1)), 8) +;BitLShift(Asc(SUBSTR(tcSrcString, 3,1)), 16) +;BitLShift(Asc(SUBSTR(tcSrcString, 4,1)), 24)ENDFUNCTION好了,完整的实现就是如下这样了,理论的东西比较多,先有了基础才能高楼筑起lcPosition = repl(chr(0),8)lnXCoord = 0lnYCoord = 0GetCursorPos(@lcPosition )API_STRTOINT(LEFT(lcPosition,4))API_STRTOINT(right(lcPosition,4))在这里我小结一下:从结构中获取内容的步骤,先用字符串分配相应的内存区域,让API函数填取其它内容,根据我们得到的字符串及成员的类型进行相应转换此处写个32位整数到四字节字符串的函数,就是一个逆转的过程.下面我们要用到FUNCTION api_inttostr (tnValue)#DEFINE mbase 2^8 -1ch0=BITAND(mbase, tnValue)ch1=BITAND(bitrshift(tnValue,8),mbase)ch1=BITAND(bitrshift(tnValue,16)mbase) FDAFDAFch1=BITAND(bitrshift(tnValue,24mbase)ch1=BITAND(bitrshift(tnValue,24mbase)ENDFUNC这些就是四字节字符串与32位的整数的相互转换了,在这里我有必要问你个问题?。

相关文档
最新文档