易语言中调用DLL使用说明
易语言创建任务计划
易语言创建任务计划任务计划是计算机系统中一项重要的功能,可以定时执行某些指定的操作。
在易语言中,我们可以使用Windows API来创建任务计划。
具体步骤如下:1. 导入Windows API模块在易语言中,我们需要使用Windows API模块来创建任务计划。
打开易语言程序,在菜单栏中选择“模块”-“导入模块”,然后选择“kernel32.dll”,点击“确定”按钮即可导入。
2. 定义任务计划的执行时间在编写代码前,我们需要先定义任务计划的执行时间。
这里我们可以使用系统时间函数来获取当前时间,并设置任务计划的执行时间。
例如:```Dim StartTime As SYSTEMTIMEDim ExecuteTime As SYSTEMTIMEGetSystemTime(StartTime)ExecuteTime = StartTimeExecuteTime.wHour = 12ExecuteTime.wMinute = 0ExecuteTime.wSecond = 0```这里定义了一个执行时间为每天中午12点的任务计划。
3. 创建任务计划使用Windows API函数“CreateScheduledTask”可以创建任务计划。
在创建任务计划前,我们需要先定义一个“TASK_TRIGGER”结构体,来指定任务计划的触发器。
例如:```Dim Trigger As TASK_TRIGGERTrigger.cbTriggerSize = SizeOf(TASK_TRIGGER)Trigger.wBeginYear = 0Trigger.wBeginMonth = 0Trigger.wBeginDay = 0Trigger.wEndYear = 0Trigger.wEndMonth = 0Trigger.wEndDay = 0Trigger.wStartHour = ExecuteTime.wHourTrigger.wStartMinute = ExecuteTime.wMinuteTrigger.TriggerType = TASK_TIME_TRIGGER_ONCETrigger.Reserved1 = 0Trigger.Reserved2 = 0```这里定义了一个“TASK_TIME_TRIGGER_ONCE”类型的任务计划触发器,表示任务计划只执行一次。
易语言模块怎么使用
易语言模块怎么使用易语言是一种流行的编程语言,特别适用于初学者和非专业程序员。
易语言模块是易语言编程环境中的一个重要组成部分,它提供了一系列封装好的功能和函数,供开发者使用。
本文将介绍易语言模块的使用方法,帮助读者更好地理解和应用这个强大的工具。
一、什么是易语言模块易语言模块是易语言编程环境中的一个重要组成部分。
它是一组相关的函数和过程的集合,以帮助开发者更快地完成某些常见的任务和功能。
通过使用模块,开发者可以避免重复编写相似的代码,提高开发效率。
易语言模块通常以扩展名“mdl”或“mod”结尾,并包含一组封装好的函数和过程。
这些函数和过程可以被其他易语言程序调用,以实现特定的功能。
易语言模块可以实现各种各样的功能,例如图形操作、网络通信、文件处理等。
二、如何使用易语言模块1. 导入模块要开始使用一个易语言模块,首先需要将它导入到你的程序中。
在易语言的编辑器中,你可以通过点击“文件”菜单中的“导入模块”选项,然后选择你要导入的模块文件,即可将其加入到你的程序中。
导入模块后,你可以在程序中使用该模块中的函数和过程。
调用这些函数和过程,可以实现模块所提供的各种功能。
2. 调用模块函数和过程一旦你导入了一个易语言模块,你就可以在程序中调用它的函数和过程了。
调用函数和过程的语法如下:函数名(参数1, 参数2, ...)其中,函数名是你要调用的函数名称,参数是该函数所需的输入。
不同的函数可能需要不同数量和类型的参数。
你需要根据模块文档或相关的示例代码,了解每个函数的参数要求。
3. 使用模块函数和过程实现特定功能通过调用易语言模块中的函数和过程,你可以实现各种功能。
例如,如果你导入了一个图形操作的模块,你可以调用其中的函数来绘制图形、改变颜色、调整大小等等。
在使用模块函数和过程之前,你应该先阅读该模块的文档或参考资料,了解每个函数和过程的详细说明。
这些说明通常包括函数的输入参数、返回值和使用示例,可以帮助你更好地理解和应用模块。
易语言常用api(dll命令)
版本2.DLL命令生成声音_, 整数型, "kernel32.dll", "Beep", 公开, , Beep,用于生成简单的声音Long,TRUE(非零)表示成功,否则返回零。
会设置GetLastError.参数声音频率, 整数型, , dwFreq,声音频率(从37Hz到32767Hz)Long,声音频率(从37Hz到32767Hz)。
在windows95中忽略.参数声音持续时间, 整数型, , dwDuration,参见相关帮助Long,声音的持续时间,以毫秒为单位。
如为-1,表示一直播放声音,直到再次调用该函数为止。
在windows95中会被忽略.DLL命令取字节数据地址_, 整数型, "kernel32.dll", "lstrcpyn", 公开, lstrcpyn .参数数据1, 字节型, 传址, lpString1.参数数据2, 字节型, 传址, lpString2.参数数据长度, 整数型, , iMaxLength.DLL命令取字节数组数据地址_, 整数型, "kernel32.dll", "lstrcpyn", 公开, lstrcpyn .参数数据1, 字节型, 传址数组, lpString1.参数数据2, 字节型, 传址数组, lpString2.参数数据长度, 整数型, , iMaxLength.DLL命令取字节集数据地址_, 整数型, "kernel32.dll", "lstrcpyn", 公开, lstrcpyn .参数数据1, 字节集, 传址, lpString1.参数数据2, 字节集, 传址, lpString2.参数数据长度, 整数型, , iMaxLength.DLL命令取文本数据地址_, 整数型, "kernel32.dll", "lstrcpyn", 公开, lstrcpyn .参数数据1, 文本型, 传址, lpString1.参数数据2, 文本型, 传址, lpString2.参数数据长度, 整数型, , iMaxLength.DLL命令取文本数组数据地址_, 整数型, "kernel32.dll", "lstrcpyn", 公开, lstrcpyn .参数数据1, 文本型, 传址数组, lpString1.参数数据2, 文本型, 传址数组, lpString2.参数数据长度, 整数型, , iMaxLength.DLL命令取整数数据地址_, 整数型, "kernel32.dll", "lstrcpyn", 公开, lstrcpyn .参数数据1, 整数型, 传址, lpString1.参数数据2, 整数型, 传址, lpString2.参数数据长度, 整数型, , iMaxLength.DLL命令取整数数组数据地址_, 整数型, "kernel32.dll", "lstrcpyn", 公开, lstrcpyn .参数数据1, 整数型, 传址数组, lpString1.参数数据2, 整数型, 传址数组, lpString2.参数数据长度, 整数型, , iMaxLength.DLL命令lstrcpyn, 整数型, "kernel32.dll", "lstrcpyn", 公开, lstrcpyn.参数数据1, 文本型, 传址, lpString1.参数数据2, 文本型, 传址, lpString2.参数数据长度, 整数型, , iMaxLength.DLL命令置线程优先级_, 整数型, "kernel32", "SetThreadPriority", 公开, $(b)设定线程的优先级别非零表示成功,零表示失败。
易语言 directx2d 的使用方法
易语言 directx2d 的使用方法易语言是一种简单易学的编程语言,广泛应用于国内的软件开发领域。
而DirectX2D是微软公司开发的一个用于图形渲染的API接口,它能够帮助开发者创建出高性能的2D图形应用程序。
本文将详细介绍如何在易语言中使用DirectX2D。
一、环境准备在开始使用DirectX2D之前,我们需要确保计算机上已经安装了DirectX SDK。
可以通过微软官方网站下载并安装最新版本的DirectX SDK。
二、导入DirectX2D库文件在易语言中使用DirectX2D需要导入相应的库文件。
首先,我们需要从DirectX SDK中找到DirectX2D的库文件(通常是一个名为d2d1.lib的文件),将其复制到易语言的lib文件夹中。
然后,在易语言的开发环境中,选择“系统”菜单下的“导入DLL函数”选项,选择d2d1.lib文件并导入。
导入成功后,我们就可以在易语言中使用DirectX2D的相关函数了。
三、创建DirectX2D对象使用DirectX2D之前,我们需要创建一个ID2D1Factory对象,该对象是DirectX2D的核心对象,用于创建其他的DirectX2D对象。
在易语言中,我们可以通过调用以下函数来创建ID2D1Factory对象:```创建Direct2D工厂对象接口,返回ID2D1Factory接口对象函数D2D1CreateFactory(ID2D1Factory **ppFactory, const D2D1_FACTORY_OPTIONS *pFactoryOptions);```在函数调用结束后,我们将会得到一个ID2D1Factory对象的指针,可以使用该指针调用其他的DirectX2D函数。
四、创建渲染目标在使用DirectX2D绘制图形之前,我们需要创建一个渲染目标。
渲染目标是DirectX2D绘制的画布,我们可以将图形绘制在渲染目标上。
在易语言中,我们可以通过调用以下函数来创建渲染目标:```创建渲染目标接口,返回ID2D1HwndRenderTarget接口对象函数D2D1CreateHwndRenderTarget(const D2D1_RENDER_TARGET_PROPERTIES *pRenderTargetProperties, const D2D1_HWND_RENDER_TARGET_PROPERTIES *pHWNDRenderTargetProperties, ID2D1HwndRenderTarget **ppHwndRenderTarget);```在函数调用时,我们需要传入渲染目标的参数,包括渲染目标的属性和渲染目标所在的窗口句柄。
易语言编程命令调用操作大全
易语⾔编程命令调⽤操作⼤全⽬录⼀、命令概述⼆、命令的格式三、命令的参数四、命令的返回值五、命令嵌套调⽤六、数组参数与数组返回值七、流程控制类命令⼋、算术运算命令九、逻辑⽐较⼗、位运算命令⼗⼀、数组操作命令⼗⼆、环境存取命令⼗三、拼⾳处理命令⼗四、⽂本操作命令⼗五、时间操作命令⼗六、数值转换命令⼗七、字节集操作命令⼗⼋、磁盘操作命令⼗九、⽂件读写命令⼆⼗、系统处理命令⼆⼗⼀、媒体播放命令⼆⼗⼆、⽹络通信命令⼆⼗三、其他命令⼆⼗四、我的播放器第三代(改)⼀、命令概述1. 什么是命令:命令是⼀个功能调⽤的开始。
2. 命令的参数:调⽤⼀个功能⽅法时候输⼊的数据或者条件。
3. 命令的返回值:调⽤完功能⽅法后得到的输出结果。
⼆、命令的格式1. 格式: [返回值][所属对象]命令名称([参数1],[参数2],...)。
2. 注意点:[]指的是可以有但不⼀定必须有的东西。
3. 例⼦:返回(1)。
三、命令的参数1. 参数可以是常量也可以是变量。
2. 调⽤时传递给命令的参数必须满⾜该命令对参数的定义,如 “输⼊(⽂本型)”这个例⼦中参数定义为⽂本格式那么传递的参数就必须是⽂本格式,否则就会出现语法错误。
3. 并⾮所有的命令都需要参数,即存在不需要参数的命令,但是命令名称后⾯的“()”以及多个参数之间的间隔符“,”不能没有。
4. 实际开发中不需要将所有的命令背下来,只需要按F1就能够查看明亮的即时帮助⽂档进⾏命令说明的查看。
四、命令的返回值1. ⼤多数命令执⾏完毕都会有返回值,即并不是所有命令结束都会有返回值的。
2. 有的命令返回运算结果,有的命令返回执⾏后的反馈信息,有的命令返回的是逻辑的判断。
3. 命令的返回值的数据类型由命令的语法规定决定,实际开发中往往需要对返回值的数据类型进⾏转换,如编辑框只显⽰⽂本,那么要显⽰数字的话就需要⽤“到⽂本()”命令进⾏转换。
程序:多项选择以及滚动写⾏.版本 2.程序集窗⼝程序集_启动窗⼝.⼦程序 _按钮1_被单击' 画板1.滚动写⾏ (多项选择 (3, “A”, 666, [2018年9⽉9⽇]))' 画板1.滚动写⾏ (多项选择 (2, “A”, 666, [2018年9⽉9⽇]))画板1.滚动写⾏ (多项选择 (1, “A”, 666, [2018年9⽉9⽇])).⼦程序 _按钮2_被单击画板1.滚动写⾏ (多项选择 (2, “A”, 666, [2018年9⽉9⽇])).⼦程序 _按钮3_被单击画板1.滚动写⾏ (多项选择 (3, “A”, 666, [2018年9⽉9⽇]))' 滚动写⾏就是换⾏输⼊' 多项选择就是在后⾯的⼏项中选择五、命令嵌套调⽤1. 命令是可以嵌套使⽤的,嵌套的意思就是命令的参数可以是另外⼀个命令的返回值2. 例⼦:编辑框1.内容=到⽂本(到数值(编辑框1.内容)+1)六、数组参数与数组返回值1. 数组型参数:有的时候命令的参数必须是⼀个数组型变量,如“重定义数组()”的命令程序:播放器三.版本 2.程序集窗⼝程序集_启动窗⼝.⼦程序 _按钮1_被单击.局部变量播放列表变量, ⽂本型, , "6"' 通过数组变量实现多⾸歌曲连续播放播放列表变量= { “F:\CloudMusic\Ace组合 - 楚地⽆歌.mp3”, “F:\CloudMusic\FLOW,GRANRODEO - Howling.mp3”, “F:\CloudMusic\Gemie,SawanoHiroyuki[nZk] - X.U.mp3” }' 播放的⾳乐需要和程序⽂件在同⼀个⽂件夹下' 播放MP3 (1, “藍井エイル - 流星.mp3”)' 尝试不在同⼀⽂件夹下要如何处理?' 增加完全路径试试' 播放MP3 (1, “F:\CloudMusic\Ace组合 - 楚地⽆歌.mp3”)' 尝试成功!通过增加全路径也能够实现跨⽂件夹的mp3播放' 尝试不通过修改源代码就能够播放其它的⾳乐?' 暂时没尝试出来。
易语言调用C++DLL获取结构体数据
易语言调用C++DLL获取结构体数据晴雯晴雯发表于 2017-7-6 16:16C语言源码发全我看看// VC6.cpp : Defines the entry point for the application.//#include "stdafx.h"#include "resource.h"#include "stdio.h"#include "commctrl.h"#include <RICHEDIT.h>#include <commdlg.h>#include <shellapi.h>#define MAX_LOADSTRING 100#define COMM_OPEN 1#define COMM_CLOSE 2#define COMM_READ 3#define COMM_WRITE 4#define IDV_VERSION "3.13"#define IDS_APPTITLE "CommMonitor" IDV_VERSION "串口监视精灵(For VC6.0 DLL版)"#define IDS_APPINFO " SoftName : " IDS_APPTITLE"\r\n \Version : " IDV_VERSION "\r\n \FileSize : 52KB\r\n \BuildDate: 2010-02-05 09:55:59\r\n\Email : ************\r\n\QQ : 348677065\r\n\Home : http:\/\/\r\n \SoftWare : http:\/\/\r\n\r\n \Copyright (C) 2003-2010 jfyes网络科技 \r\n"#pragma pack(push)#pragma pack(1) //设置为1字节对齐typedef struct _HookData{BYTE ComPort; //串口号BYTE CommState; //串口状态HFILE FileHandle; //被打开的文件句柄长整型无符号int DataSize; //数据大小长整型有符号char Data [8192] ; //串口数据}THookData, *PHookData;#pragma pack(pop)//DLL 实例句柄HINSTANCE gPMonitorComm = NULL;// TOnData = function (AHook: PHookData): Integer;stdcall;typedef LONG(CALLBACK * TOnData)(LONG lParam);//启动串口监视typedef BOOL(CALLBACK * TMonitorComm)(DWORD Pid, DWORD ComIndex, TOnData lpCallFunc);//关闭串口监视, 返BOOL类型typedef BOOL(CALLBACK * TUnMonitorComm)(void);//取得全部进程IDtypedef void(CALLBACK * TGetAllProcess)(HWND hComBox);//过程变量TMonitorComm MonitorComm;TUnMonitorComm UnMonitorComm;TGetAllProcess GetAllProcess;//////////////////////////////LONG ReadT otal = 0;LONG WriteT otal = 0;HWND hMemo = NULL;HWND hHex = NULL;//是否是启动监视BOOL bActive = FALSE;HINSTANCE HInst;BOOL MouseLButtonDown = FALSE;LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);LONG ColorT oRGB(LONG Color){if (Color < 0)return GetSysColor(Color & 0x000000FF);elsereturn Color;}void SetRichEditFontColor(LONG AColor){CHARFORMAT Format;//memset(Format, 0, sizeof(CHARFORMAT));Format.cbSize = sizeof(CHARFORMAT);Format.dwMask = CFM_COLOR;Format.crTextColor = ColorToRGB(AColor);SendMessage(hMemo, EM_SETCHARFORMAT, SCF_SELECTION, LPARAM(&Format));}void SetRichEditFontName(LPCSTR FontName){CHARFORMAT Format;Format.cbSize = sizeof(CHARFORMAT);Format.dwMask = CFM_FACE;memset(Format.szFaceName, 0, sizeof(Format.szFaceName));lstrcpy(Format.szFaceName, FontName);SendMessage(hMemo, EM_SETCHARFORMAT, 0, LPARAM(&Format));}int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){// TODO: Place code here.//加载DLLgPMonitorComm = LoadLibrary("PMonitorComm.dll");if (!gPMonitorComm){MessageBox(GetForegroundWindow(), "加载PMonitorComm.dll失败,请检察该DLL是否存在。
易语言核心支持库DLL命令大全
易语言核心支持库DLL命令大全.版本 2.DLL命令 _取短整型指针, 整数型, , "lstrcpyn", 公开.参数目的指针, 短整数型, 传址.参数源指针, 短整数型, 传址.参数复制长度, 整数型, , 0.DLL命令 _取双精度指针, 整数型, , "lstrcpyn", 公开.参数目的指针, 字节型, 传址.参数源指针, 字节型, 传址.参数复制长度, 整数型, , 0.DLL命令 _取文本指针, 整数型, , "lstrcpyn", 公开.参数目的指针, 文本型, 传址.参数源指针, 文本型, 传址.参数复制长度, 整数型, , 0.DLL命令 _取整型指针, 整数型, , "lstrcpyn", 公开.参数目的指针, 整数型, 传址.参数源指针, 整数型, 传址.参数复制长度, 整数型, , 0.DLL命令 _取子程序指针, 整数型, , "lstrcpyn", 公开, 返回整型子程序 .参数目的指针, 子程序指针.参数源指针, 子程序指针.参数复制长度, 整数型, , 0.DLL命令 _取字节集指针, 整数型, , "lstrcpyn", 公开.参数目的指针, 字节集, 传址.参数源指针, 字节集, 传址.参数复制长度, 整数型, , 0.DLL命令 _取字节指针, 整数型, , "lstrcpyn", 公开.参数目的指针, 字节型, 传址.参数源指针, 字节型, 传址.参数复制长度, 整数型, , 0.DLL命令 CallNextHookEx, 整数型, , "CallNextHookEx", 公开, 传递钩子 .参数钩子句柄, 整数型.参数钩子类型, 整数型.参数消息一, 整数型.参数消息二, 整数型.DLL命令 CharLower, 文本型, , "CharLowerA", 公开, 到小写_.参数 str, 文本型.DLL命令 CharUpper, 文本型, , "CharUpperA", 公开, 到大写_.参数 str, 文本型.DLL命令 CloseHandle, 整数型, "kernel32.dll", "CloseHandle", 公开 .参数对象句柄, 整数型.DLL命令 CopyMemory_msg, 整数型, , "RtlMoveMemory", 公开, 复制消息 .参数目标地址, MSG.参数源地址, 整数型.参数复制长度, 整数型.DLL命令 CreateFont, 整数型, "gdi32", "CreateFontA", 公开, 用指定的属性创建一种逻辑字体执行成功则返回逻辑字体的句柄,零表示失败。
SkinSharp皮肤控件易语言API调用方法
是否锁定。1 为锁定,0 为解锁
DLL 命令名 返回值类型 公开 备注 置菜单透明度 整数型 √ 设置菜单的透明度,成功返回 0 DLL 库文件名:
SkinH_EL.dll 在 DLL 库中对应命令名:
SkinH_Alpha_Menu
参数名
类型
传址 数组 备注
透明度
整数型
取值范围 0-255
DLL 命令 返回值类 公
SkinH_Detach 参数名 类型
传址 数组 备注
DLL 命令名
指定不使用皮肤的 组件
返回值类 型
公开 备注
整数型
√
卸载指定句柄的窗体或者控件的皮肤,成功 返回 0
DLL 库文件名:
SkinH_EL.dll 在 DLL 库中对应命令名:
SkinH_Detach_E x
参数名
类型
传 址
数组
备注
句柄
返回值类 型
公开 备注
置控件的背 景色
整数型
√
DLL 库文件名:
目前仅对单选框,复选框,分组框有效。成功返回 0, 失败返回非 0
SkinH_EL.dll 在 DLL 库中对应命令名:
SkinH_BGColor
参数名
类型
传 址
数组
备注
句柄
整数型
控件句柄
红色分量 绿色分量 蓝色分量
整数型 整数型 整数型
SkinH_EL.dll 在 DLL 库中对应命令名:
SkinH_Alpha
参数名
类型
传址 数组
备注
句柄
整数型
指定窗体句柄
透明度
整数型
取值范围 0-255
DLL 命令名
C#,调用dll产生尝试读取或写入受保护的内存。这通常指示其他内存已损坏。的问题
C#,调⽤dll产⽣尝试读取或写⼊受保护的内存。
这通常指⽰其他内存已损坏。
的问题由于易语⾔与c#做的DESC加解密⽅式,返回的数据不⼀致,所以,我⽤易语⾔写了⼀个dll,供c#调⽤,结果在post的时候,有时候能正确返回数据,有时候则不能正常返回,⽽是返回空数据(c#没有做异常处理)后来,在c#端抛出异常后发现,原来返回空值,都已经报错了(提⽰:尝试读取或写⼊受保护的内存。
这通常指⽰其他内存已损坏。
)在⽹上查了,在c#调⽤ dll的时候,⽤指针的⽅式,就没有再出现问题。
/// <summary>/// 这是易语⾔的DESC加密解密的dll/// </summary>/// <param name="strText">待加密的⽂本</param>/// <param name="key">密钥</param>/// <returns></returns>[DllImport("DESEncrypt.dll")]public static extern string Encrypt(string strText, string key);[DllImport("DESEncrypt.dll")]public static extern string Decrypt(string strText, string key);改成如下⽅式:[DllImport("DESEncrypt.dll")]public static extern IntPtr Encrypt(IntPtr strText, IntPtr key);[DllImport("DESEncrypt.dll")]public static extern IntPtr Decrypt(IntPtr strText, IntPtr key);返回值和参数,都改成 IntPtr 类型调⽤的时候改成这种⽅式IntPtr ptrIn = Marshal.StringToHGlobalAnsi(strPara);IntPtr ptrIn2 = Marshal.StringToHGlobalAnsi("kimsSoftE");IntPtr ptrIn3 = Decrypt(ptrIn, ptrIn2);string[] strParaAry = Marshal.PtrToStringAnsi(ptrIn3).Split(',');使⽤完后释放对象Marshal.ReleaseComObject(strParaAry);。
钩子 易语言
易语言钩子DLL注入源码及源码说明2010-04-06 13:52[所有要使用到的API].版本 2.DLL命令 LoadLibraryA, 整数型.参数 lpLibFileName, 文本型.DLL命令 SetWindowsHookExA, 整数型, "user32.dll", "SetWindowsHookExA", 公开, SetWindowsHookEx.参数钩子类型, 整数型, , idHook.参数回调函数地址, 整数型, , lpfn.参数实例句柄, 整数型, , hmod.参数线程ID, 整数型, , dwThreadId.DLL命令 FreeLibrary, 整数型, "kernel32.dll", "FreeLibrary", , 释放指定的动态链接库,它们早先是用LoadLibrary ;API函数装载的非零表示成功,零表示失败。
会设置GetLastError.参数库句柄, 整数型, , hLibModule,要释放的一个库句柄,在VB里使用只能用这个函数释放那些由应用程序明确装载的DLL。
对LoadLibrary的每一次调用都应该有一个对应的FreeLibrary 调用;.DLL命令 UnhookWindowsHookEx, 整数型, "user32.dll", "UnhookWindowsHookEx", , UnhookWindowsHookEx.参数钩子句柄, 整数型, , hHook.DLL命令 CallNextHookEx, 整数型, "user32.dll", "CallNextHookEx", 公开, CallNextHookEx .参数钩子句柄, 整数型, , hHook.参数代码值, 整数型, , ncode.参数附加参数1, 整数型, , wParam.参数附加参数2, 整数型, 传址, lParam.DLL命令 GetProcAddress, 整数型, "kernel32.dll", "GetProcAddress", , 取进程路径.参数模块句柄, 整数型, , hModule.参数进程名称, 文本型, , lpProcName.DLL命令 GetCurrentThreadId, 整数型, "kernel32.dll", "GetCurrentThreadId".DLL命令获取特别文件夹位置_, 整数型, "shell32.dll", "SHGetSpecialFolderLocation".参数窗口句柄, 整数型, , hwndOwner.参数文件夹位置, 整数型, , nFolder.参数结构, 项目标识符列表_, 传址, pIdl.DLL命令从列表id取路径_, 整数型, "shell32.dll", "SHGetPathFromIDListA", , $(b).参数结构指针, 整数型, , pIdl.参数路径, 文本型, 传址, pszPath.DLL命令 CallWindowProcA, 整数型, "user32.dll", "CallWindowProcA".参数动态调用代码, 字节集, , 一定要用本人编写的.参数子程序, 子程序指针, , 子程序指针.参数参数, 整数型, 数组, 为整数数组,参数1为成员1…类推;文本型和字节集型(自定义结构)为指针.参数参数数目, 整数型, , 一定要和参数数组相符,不然会出错.参数是否C调用, 整数型, , 真为cdecl调用方式,假为stdcall调用方式(即标准WINAPI方式)[这里函数所有代码和一个自定义类型,API代码在左边].版本 2.程序集程序集1.程序集变量临时呼出热键, 整数型.程序集变量临时载入窗口, 窗口.程序集变量钩子模块句柄, 整数型, , "1000".程序集变量钩子句柄, 整数型, , "1000".程序集变量钩子IDx, 整数型.程序集变量 x, 整数型.程序集变量钩子句柄1, 整数型.程序集变量 temp目录, 文本型.程序集变量 xxx, 整数型.程序集变量热键钩子句柄, 整数型.程序集变量第一次, 逻辑型.子程序调用_调用子程序, 整数型, 公开, 呼叫某个函数可以传入无限个参数返回函数返回值.参数子程序指针, 子程序指针, , 指定函数.参数参数, 整数型, 可空数组, 指定参数可以不写, 参数为数组格式为参数[1]=xxx 参数[2]=xxx 文本型或字节集请用转换指针格式2 加入成员(参数,xxx).局部变量动态调用代码, 字节集动态调用代码= { 85, 139, 236, 86, 139, 117, 16, 141, 78, 255, 133, 201, 124, 21, 139, 69, 12, 141, 4, 136, 65, 139, 16, 137, 85, 16, 255, 117, 16, 131, 232, 4, 73, 117, 242, 255, 85, 8, 137, 69, 12, 139, 69, 20, 133, 192, 116, 13, 141, 4, 181, 0, 0, 0, 0, 137, 69, 16, 3, 101, 16, 139, 69, 12, 94, 93, 194, 16, 0 }返回 (CallWindowProcA (动态调用代码, 子程序指针, 参数, 取数组成员数 (参数), 0)).子程序操作_取特定目录, 文本型, 公开, 取特定的目录(返回所要取的指定目录名无效返回空) .参数欲获取目录类型, 整数型, 可空, 0我的桌面 1临时目录 5我的文档 6我的收藏夹 7我的启动11我的开始菜单 20系统字体 36Windows安装目录 37系统目录 [99更多].局部变量路径, 文本型.局部变量标示结构, 项目标识符列表_.局部变量目录类型, 整数型.如果真 (欲获取目录类型= 99)输出调试文本 (“0我的桌面 2我的程序 5我的文档 6我的收藏夹 7我的启动 8我最近的文档 9我的发送到 11我的开始菜单 13我的音乐 14我的视频 16我的桌面 20系统字体 22开始菜单组 23程序组 24启动组 25桌面 31收藏夹 32我的浏览器临时目录 33我的Cookies 34我的历史记录36Windows安装目录 37系统目录 38文件安装目录 39我的图片 40用户目录 41系统目录 46文档 47管理工具 48我的管理工具 53音乐 54图片 55视频”).如果真结束.如果 (欲获取目录类型= 1)目录类型= 34.否则目录类型=欲获取目录类型.如果结束获取特别文件夹位置_ (0, 目录类型, 标示结构)路径=取空白文本 (255)从列表id取路径_ (标示结构.结构大小, 路径).如果真 (路径=“”)返回 (“”).如果真结束.如果真 (欲获取目录类型= 1)路径=子文本替换 (路径, “History”, “Temp”, , , 真).如果真结束返回 (路径+“\”).子程序注入_安装钩子DLL, 整数型, 公开, DLL注入返回0=失败整数型 DLL接口(代码值,参数1,参数2).参数线程ID, 整数型, , -1 全局钩子.参数 DLL全名, 文本型, , DLL全名.参数 DLL接口, 文本型, 可空, 默认整数型钩子接口(代码值,参数1,参数2).局部变量临时变量, 整数型.局部变量目录, 文本型.局部变量窗口句柄, 整数型.如果真 (是否为空 (DLL接口) =真)DLL接口=“钩子接口”.如果真结束.如果真 (线程ID = 0)返回 (0).如果真结束.如果真 (线程ID = -1)线程ID = 0.如果真结束钩子IDx =钩子IDx + 1钩子模块句柄 [钩子IDx] = LoadLibraryA (DLL全名)钩子句柄 [钩子IDx] = SetWindowsHookExA (3, GetProcAddress (钩子模块句柄 [钩子IDx], DLL 接口), 钩子模块句柄 [钩子IDx], 线程ID)目录=操作_取特定目录 (1)写配置项 (目录+“ada.ini”, “ada”, “钩子句柄”, 到文本 (钩子句柄 [钩子IDx]))输出调试文本 (钩子IDx, 钩子模块句柄 [钩子IDx], 钩子句柄 [钩子IDx])返回 (钩子IDx).版本 2.子程序注入_卸载钩子DLL, 逻辑型, 公开.参数钩子ID, 整数型, 可空, 卸载所有时无效.参数卸载所有, 逻辑型, 可空.局部变量 xx, 整数型.如果真 (卸载所有).如果真 (钩子IDx > 0).计次循环首 (钩子IDx, xx).如果真 (钩子模块句柄 [xx] ≠ 0)FreeLibrary (钩子模块句柄 [xx])UnhookWindowsHookEx (钩子句柄 [xx]).如果真结束.计次循环尾 ().如果真结束返回 (真).如果真结束.如果真 (钩子ID > 0).如果真 (钩子模块句柄 [钩子ID] ≠ 0)FreeLibrary (钩子模块句柄 [钩子ID])UnhookWindowsHookEx (钩子句柄 [钩子ID])返回 (真).如果真结束.如果真结束返回 (假).子程序注入_初始化钩子DLL, 整数型, 公开, DLL用..参数代码值, 整数型.参数参数1, 整数型.参数参数2, 整数型.参数初始, 子程序指针.局部变量 xxxx, 整数型.如果真 (钩子句柄1 = 0)temp目录=操作_取特定目录 (1)钩子句柄1 =到整数 (读配置项 (temp目录+“ada.ini”, “ada”, “钩子句柄”, )).如果真结束.如果真 (第一次=假)第一次=真调用_调用子程序 (初始).如果真结束返回 (CallNextHookEx (钩子句柄1, 代码值, 参数1, 参数2)).子程序注入_设置呼出窗口, 逻辑型, 公开.参数设置热键, 整数型.参数呼出窗口, 窗口临时呼出热键=设置热键临时载入窗口=呼出窗口热键钩子句柄= SetWindowsHookExA (2, 到整数 (&呼出键接口), 0, GetCurrentThreadId ()) .如果真 (热键钩子句柄> 0)返回 (真).如果真结束返回 (假).子程序呼出键接口, 整数型.参数一, 整数型.参数二, 整数型.参数三, 整数型.如果真 (一= 0 且二=临时呼出热键且三> 0) .如果 (是否已创建 (临时载入窗口)).如果 (临时载入窗口.可视)临时载入窗口.可视=假.否则临时载入窗口.可视=真.如果结束.否则载入 (临时载入窗口, , 假)临时载入窗口.Esc键关闭=假临时载入窗口.最小化按钮=真.如果结束.如果真结束返回 (CallNextHookEx (热键钩子句柄, 一, 二, 三)).版本 2.数据类型项目标识符列表_, , ITEMIDLIST.成员结构大小, 整数型, , , cb.成员标识符长度, 字节型, , "255", abID此函数是用来调用指针函数的.就是CALL取目录用这个我就不解释了下面是源码主要函数函数解释:本函数参数1为要HOOK的线程ID,参数2为要注入的DLL名,参数3[可空]为DLL接口名字空则为"钩子接口".下面解释是如何实现的:1.首先使用LoadLibraryA获取DLL模块地址.2.然后设置SetWindowsHookExA参数一为HOOK类型,使用WH_GETMESSAGE(3) Hook来监视从GetMessage or PeekMessage函数返回的消息。
易语言API图文教程
易语言与WIN32 API的使用本人也是个小菜鸟啦。
今天写这个,就是为了一下比我还新手的同学参考参考的资料。
----------------------基础知识:先来了解一下,什么的动态链接库动态链接库动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
函数的可执行代码位于一个DLL 中,该DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
DLL 还有助于共享数据和资源。
多个应用程序可同时访问内存中单个DLL 副本的内容。
DLL 是一个包含可由多个程序同时使用的代码和数据的库。
其实你的系统就有很多的动态链接库,例如KERNEL32.DLL UESER32.DLL.....再看看,什么是API。
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
推荐API工具,是易语言自带的API助手,一般在X:\e\wizard\API助手如下图,,很好用,很强大哦。
可以看出,有了API,我们编程的生活是多么的美好,很多函数都不需要我们亲力亲为的去写,只要调用就OK了。
然后,我们来看一下数据类型。
因为在API中有很多地方使用了结构体(看百度哦),为了对这些结构体进行匹配,所以在易语言中我们也要对他建立相应的数据类型。
例如这是C语言的结构体格式SYSTEMTIME StructureThe SYSTEMTIME structure has the following form:typedef struct _SYSTEMTIME {WORD wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds;} SYSTEMTIME;而我们如果想在易语言中实现他,就可以这样定义.版本2.数据类型系统时间_, , SYSTEMTIME.成员年, 短整数型, , , wYear.成员月, 短整数型, , , wMonth.成员星期, 短整数型, , , wDayOfWeek.成员日, 短整数型, , , wDay.成员小时, 短整数型, , , wHour.成员分, 短整数型, , , wMinute.成员秒, 短整数型, , , wSecond.成员毫秒, 短整数型, , , wMilliseconds你可能会奇怪,我怎么知道什么WORD 是什么类型。
易语言中调用DLL使用说明
易语言中调用DLL使用说明基本说明本文所描述的部分功能需易语言4.01或以上版本支持。
“在易语言中调用DLL”包含两方面的内容:调用Windows系统API函数;调用普通DLL函数。
下文用到的“调用API”或“调用DLL”等字眼,除非特别注明,一般都是指以上两方面之一或之和,视上下文而定。
绝大多数情况下,无需明确区分调用的是系统API还是普通DLL。
目前易语言只支持以stdcall方式调用DLL中的导出函数。
Windows系统API一般都是以stdcall调用方式导出的,故在易语言中调用它们时通常不必考虑函数调用方式的问题。
而普通DLL有可能导出“非stdcall调用方式”(比如cdecl)的函数,调用时需要特别注意。
一般而言,考虑到通用性,DLL开发者都会选择导出以sdtcall方式调用的函数。
(支持生成DLL的编程语言通常都支持导出stdcall调用方式的函数,具体实现请参考各编程语言手册。
)易语言编译生成的DLL,其导出函数全部为stdcall调用方式,所以在易语言中调用易语言生成的DLL不存在问题。
目前在易语言中调用DLL时只支持1字节对齐的结构(自定义数据类型)如果DLL命令的某个参数或参数的某个成员是结构类型(自定义数据类型),则其对齐方式必须是1字节对齐。
Windows系统API中所用到的结构都是1字节对齐的,故在调用API时不受此限制。
但如果想用其它编程语言生成DLL供易语言调用且数据类型中包含了1或2字节数据长度的成员(如字符型或短整数),就需要考虑结构的1字节对齐。
在Delphi中,可以这样定义1字节对齐的结构(结构在Delphi中称为record):在其它编程语言或编译器中的定义方式请参考各自的编程手册。
目前易语言支持调用任意复杂的DLL命令只要满足了前面的两个条件——调用方式为stdcall,参数结构为1字节对齐——易语言支持调用任意复杂的DLL命令:参数除了可以是基本数据类型或普通结构类型外,还可以是基本类型地址或基本类型数组,也可以是结构类型地址或结构类型数组,结构类型的成员中还可以包含任意数量和任意层次的其它结构、结构地址、结构数组,等等。
Labview调用dll详解(C语言DLL
Labview调用dll详解(C语言DLLLabview调用dll详解(C语言DLL)之一labview中提供了两个C接口,一个是CLF,一个是CIN。
本帖子讨论DLL的调用,也就是CLF。
由于C的强大功能,本帖子讨论C创建的DLL的调用。
首先简单解释一下DLL,也就是动态链接库。
DLL 的好处是屏蔽底层的细节,用户不用也不能打开DLL,便于资源代码数据共享,节省内存等。
一般情况下labview是不需要调用DLL的。
DLL分两类,一类是API,一类是自己创建的DLL。
这两者本质都一样,但是调用一般来说是有区别的。
R) {$ f0 x7 @3 B 要调用DLL必须要有DLL,也就是所谓的路径。
这个一般不会出错的,不用解释了。
其次是选择函数,这个也不难。
线程一般选择UI线程,任意线程的DLL和UI线程DLL有颜色上的区别,其次在源代码中也有区别(这个不是DLL调用失败的主因,不用过多纠缠)。
接下来是调用设置:Ccall和standcall。
一般来说,windows API采用的是standcall,自己创建的采用Ccall。
两种调用区别在于参数进入栈的顺序不同。
这里随便说一下,栈由系统自动分配内存,类似C语言的int a都是分配的栈内存;new分配的是堆内存。
栈内存由系统负责回收,堆内存一般程序员负责释放,所以要注意系统的内存泄漏。
labview的初始化数组也会分配内存,所以不宜频繁调用。
8 h. p8 V/ m, J- D4 X 接下来是最重要的参数配置,也是最复杂的参数配置。
首先要知道函数原型,C语言里面叫导出函数类。
一般在include文件下面的头文件里面。
下面是一个典型的函数原型:extern "C" ZLDS10X_DLL_API SENSOR_HANDLE ZLDS10X_DLL_stdcall ZLDS10X_Open(char * portnum , int baud , int timeout , int address); 值得注意的是,很多人会把函数原型看错。
DLL使用介绍范文
DLL使用介绍范文动态链接库(Dynamic Link Library,简称DLL)是一种Microsoft Windows操作系统中常用的文件类型,它包含可被程序调用执行的代码和数据。
DLL文件能够提供程序员在开发和编写应用程序时的便利性,通过将常用的功能和代码存储在DLL文件中,可以提高代码的复用性和可维护性,并且减少了程序的体积,减少了编译时间。
使用DLL文件可以将相同的代码抽象出来,形成一个独立的模块,供其他程序调用。
这种模块化的设计让程序更容易维护和管理,同时也有助于提高程序的性能和效率。
在开发过程中,DLL文件可以被多个应用程序共享,从而避免了重复编写相同的代码,提高了开发效率。
DLL文件的使用不仅可以提高程序的可维护性和扩展性,还可以加快程序的启动速度和运行速度。
由于DLL文件是在程序运行时加载到内存中的,因此程序启动时不需要加载所有的代码,只需要加载必要的部分,这可以加快程序的启动速度。
另外,由于DLL文件可以在内存中共享,多个程序可以同时使用同一个DLL文件,降低了内存的占用,提高了程序的运行速度。
在实际应用中,使用DLL文件可以实现插件式的架构设计,允许应用程序的功能可以通过添加或删除DLL文件来进行扩展或删减。
这种设计方式使应用程序的功能更加灵活和可扩展,可以根据需求动态加载和卸载DLL文件,实现功能的动态更新和升级。
除了以上提到的优点外,DLL文件还可以实现一些高级的功能,比如实现程序的多语言支持,可以在DLL文件中存储不同语言版本的字符串,根据需要加载对应的字符串资源;还可以实现程序的加密保护,将一些敏感的代码和数据存储在DLL文件中,通过加密算法进行保护,提高程序的安全性。
总的来说,DLL文件是一种非常有用的程序组件,可以帮助程序员提高代码的复用性和可维护性,加快程序的启动速度和运行速度,实现程序的模块化设计和插件式架构,为程序的开发和维护带来很大的便利。
因此,在实际开发中,合理地使用DLL文件是非常重要和必要的。
易语言DLL开发手册
易语言Dll开发手册一.关于易语言DLL从易语言3.6版开始,已经能够支持对DLL动态链接库的开发,编译出的DLL 是标准的DLL,和其他编程语言生成的标准DLL的调用方法相同。
易语言编写出的DLL,在非独立编译exe时只需要DLL文件随应用程序一起发行,而独立编译exe时无需将DLL文件随应用程序一起发行。
二.新建易语言DLL程序新建一个易语言程序,然后选择图标,易语言就会自动创建出编写态连接库的代码区(程序集),如下图所示:创建完毕就可以在代码区里编写DLL程序。
三.如何生成动态连接库(DLL)易语言中的DLL编写方法和易模块的编写方法类似,都需要有对外的公开接口。
下面将通过编写一个“自创信息框”来看一下用易语言如何编写和调用DLL。
编写DLL时的公开接口只能由以下方式生成,新建一个子程序,然后把“公开”选中,在DLL中任何程序集中选中“公开”的子程序都作为对外接口,如下图所示:修改一下子程序名称,叫“自创信息框”,然后创建2个参数“标题”和“内容”,都定义成整数型,如下图所示:注意:目前DLL接口函数中的参数只能为以下9种之一:字节型、短整数型、整数型、长整数型、小数型、双精度小数型、逻辑型、日期时间型、子程序指针型定义好DLL参数后,我们可以创建新窗体作为信息框窗口,在新窗体上画一个按钮,一个标签,如下图所示:为了让用户按下确定按钮后,窗口能关闭,可以双击确定按钮,创建按钮“被单击”的触发事件,写入如下代码:然后返回到刚才的程序集1代码区开始编写代码。
由于2个参数都定义成了整数型,而调用的时候传递过来的标题和内容一定是文本型的,那么怎样去取得里面内容呢?别急,易语言3.6版中考虑到了这个问题,所以新增加了3个命令:“指针到文本”、“指针到字节集”、“写到内存”。
当用户传递的是文本型或者字节集型,易语言将自动转换成指针,我们可以使用“指针到文本”或“指针到字节集”把原来的文本返回出来。
如下图所示:到此已经完成“自创信息框DLL”所有工作,最后可以选择菜单“程序”→“编译”将其编译为DLL。
python调用dll的例程
python调用dll的例程在进行软件开发时,如果需要使用到其他语言或平台的功能,一种常见的解决方式就是调用动态链接库(Dynamic Link Library,简称DLL)。
Python作为一种高级语言,也可以很方便地调用DLL库中的函数来实现各类功能。
在本文中,我们将为大家详细介绍如何用Python调用DLL的例程。
步骤1:准备 DLL 文件首先,我们需要有一个 DLL 文件,这个文件可以是由其他编程语言编写的,如C、C++等。
在使用这个 DLL 文件之前,需要先将它成功编译生成。
一般来说,生成 DLL 文件有两种方式,一种是在C/C++编译器中编译生成,另一种是通过 Visual Studio 的命令行工具生成。
无论使用哪种方式,确保在开发前已经生成了可供调用的DLL文件。
步骤2:安装 Python 扩展模块调用 DLL 时需要使用到 Python 扩展模块,我们需要先通过命令行工具安装相关的扩展模块,常用的扩展模块有 ctypes 和 CFFI。
在这里,我们以 ctypes 扩展模块为例,使用 pip 工具执行以下命令安装:pip install ctypes经过简短时间的下载和安装后,我们就成功安装了 ctypes 扩展模块。
步骤3:导入 ctypes 模块成功安装 ctypes 扩展模块后,我们就可以在 Python 代码中使用该模块。
在开始调用 DLL 之前,首先需要导入 ctypes 模块:import ctypes步骤4:加载 DLL 文件在将 DLL 文件中的函数导入到 Python 中之前,需要通过ctypes 模块先将 DLL 文件加载,可以通过以下代码实现:dll = ctypes.CDLL("example.dll")其中,example.dll 需要替换成实际使用的 DLL 文件的名称。
注意:如果 DLL 文件不在 Python 工作目录下,需要加上文件的完整路径。
易语言API高级技巧教学
易语⾔API⾼级技巧教学⾸先声明,本⽂的读者该卖是:具有相当的易⾔语基础的、能较熟练地把常⽤的的API从VB/C声明转换到易⾔语DLL命令的易⾔语喜欢者。
1,使⽤指针易⾔语中出于安定、⽅便考虑,没有直接提供指针,这正在进⾏⼀些⾼级纵时不是很⽅便,固然有⼀些第三⽅⽀撑库可以取出变量指针(⽐如我的eLib++ 注:该⽀撑库系Delphi开发,本⼈已开放源代,你可以到易⾔语下载区瞧瞧)但是仅仅为了这个纵就带上⼀个⽀撑库不太值得。
实在⽤⼀个API,加上⼀些技术就可以欺骗Windows和易⾔语,让它们报告你⼀个变量的指针。
这个API是lstrcpyn。
⽤过C开发Windows下的步骤的朋友可能对这个API相⽐熟识,就是字符串拷贝。
正在windows下取代C 准则库函数strncpy的。
字符串拷贝怎样能获得变量指针呢?秘密就正在这个API的返回值:瞧瞧MSDN:“If the function succeeds, the return value is a pointer to the buffer”该函数把第⼆个参数指定的字符串双制到第⼀个参数指定的字符串,第三个参数指定双制的长度。
假如双制成功,返回第⼀个参数(缓冲区buffer)的地点。
瞧到了吗?它返回第⼀个参数的地点!!那么我们把需求取地点的变量给它的第⼀个参数,然后想要领让它双制成功,它不就返回了那个变量的地点了吗?界说⼀个DLL命令如下:Dll命令:取⽂本指针返回值类型:整数型正在Dll库中的命令名:lstrcpyn参数:欲取其指针的⽂本数据类型:⽂本型 <传址>参数:欲取其指针的⽂本数据类型:⽂本型 <传址>参数:保存数据类型:整数型备注:0这样挪⽤:⽂本1 = “abcdefg”指针1 =取⽂本指针 (⽂本1, ⽂本1, 0)把⽂本1双制到⾃⼰,双制长度为0字节(也就是什么都不双制),然后返回⽂本1的指针。
就这么简略。
易语言 辅助 读取内存数据的方法
易语言辅助读取内存数据的方法
当使用易语言进行内存数据读取时,可以采用以下方法:
1. 使用API函数:通过调用Windows API函数来读取内存数据。
可以使用ReadProcessMemory函数来读取其他进程的内存数据,也可以使用GetModuleHandle和ReadMemory函数来读取当前进程的内存数据。
需要注意权限和错误处理。
2. 使用EasyHook库:EasyHook是一个用于Windows系统的开源Hooking库,可以用来读取内存中的数据。
可以使用它来注入钩子函数到目标进程中,并在其中读取内存数
据。
3. 使用FindWindow函数:通过FindWindow函数找到目标窗口的句柄,然后使用ReadProcessMemory函数读取目标进程的内存数据。
这种方法适用于读取其他进程中的数据。
4. 使用第三方工具:有一些第三方工具可以帮助读取内存数据,比如Cheat Engine 等。
可以通过这些工具来搜索并读取目标进程的内存数据。
5. 使用自定义DLL注入:编写一个自定义的DLL,然后使用DLL注入技术将其注入到目标进程中。
在DLL中编写读取内存数据的函数,然后通过远程线程调用执行这些函数。
6. 使用易语言的系统函数:易语言本身提供了一些系统函数来读取内存数据,比如VirtualAlloc、WriteProcessMemory等。
可以利用这些函数来读取其他进程的内存数据。
以上是一些常用的方法,在实际使用时需要根据具体的需求和情况来选择合适的方法。
需要注意权限、错误处理和对目标进程的合法性,以及如何处理读取到的数据。
在易语言中调用DLL使用说明
易语言中调用DLL使用说明基本说明本文所描述的部分功能需易语言4.01或以上版本支持。
“在易语言中调用DLL”包含两方面的内容:调用Windows系统API函数;调用普通DLL函数。
下文用到的“调用API”或“调用DLL”等字眼,除非特别注明,一般都是指以上两方面之一或之和,视上下文而定。
绝大多数情况下,无需明确区分调用的是系统API还是普通DLL。
目前易语言只支持以stdcall方式调用DLL中的导出函数。
Windows系统API一般都是以stdcall调用方式导出的,故在易语言中调用它们时通常不必考虑函数调用方式的问题。
而普通DLL有可能导出“非stdcall调用方式”(比如cdecl)的函数,调用时需要特别注意。
一般而言,考虑到通用性,DLL开发者都会选择导出以sdtcall方式调用的函数。
(支持生成DLL的编程语言通常都支持导出stdcall调用方式的函数,具体实现请参考各编程语言手册。
)易语言编译生成的DLL,其导出函数全部为stdcall调用方式,所以在易语言中调用易语言生成的DLL不存在问题。
目前在易语言中调用DLL时只支持1字节对齐的结构(自定义数据类型)如果DLL命令的某个参数或参数的某个成员是结构类型(自定义数据类型),则其对齐方式必须是1字节对齐。
Windows系统API中所用到的结构都是1字节对齐的,故在调用API时不受此限制。
但如果想用其它编程语言生成DLL供易语言调用且数据类型中包含了1或2字节数据长度的成员(如字符型或短整数),就需要考虑结构的1字节对齐。
在Delphi中,可以这样定义1字节对齐的结构(结构在Delphi中称为record):在其它编程语言或编译器中的定义方式请参考各自的编程手册。
目前易语言支持调用任意复杂的DLL命令只要满足了前面的两个条件——调用方式为stdcall,参数结构为1字节对齐——易语言支持调用任意复杂的DLL命令:参数除了可以是基本数据类型或普通结构类型外,还可以是基本类型地址或基本类型数组,也可以是结构类型地址或结构类型数组,结构类型的成员中还可以包含任意数量和任意层次的其它结构、结构地址、结构数组,等等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
易语言中调用DLL使用说明基本说明本文所描述的部分功能需易语言4.01或以上版本支持。
“在易语言中调用DLL”包含两方面的内容:调用Windows系统API函数;调用普通DLL函数。
下文用到的“调用API”或“调用DLL”等字眼,除非特别注明,一般都是指以上两方面之一或之和,视上下文而定。
绝大多数情况下,无需明确区分调用的是系统API还是普通DLL。
目前易语言只支持以stdcall方式调用DLL中的导出函数。
Windows系统API一般都是以stdcall调用方式导出的,故在易语言中调用它们时通常不必考虑函数调用方式的问题。
而普通DLL有可能导出“非stdcall调用方式”(比如cdecl)的函数,调用时需要特别注意。
一般而言,考虑到通用性,DLL开发者都会选择导出以sdtcall方式调用的函数。
(支持生成DLL的编程语言通常都支持导出stdcall调用方式的函数,具体实现请参考各编程语言手册。
)易语言编译生成的DLL,其导出函数全部为stdcall调用方式,所以在易语言中调用易语言生成的DLL不存在问题。
目前在易语言中调用DLL时只支持1字节对齐的结构(自定义数据类型)如果DLL命令的某个参数或参数的某个成员是结构类型(自定义数据类型),则其对齐方式必须是1字节对齐。
Windows系统API中所用到的结构都是1字节对齐的,故在调用API时不受此限制。
但如果想用其它编程语言生成DLL供易语言调用且数据类型中包含了1或2字节数据长度的成员(如字符型或短整数),就需要考虑结构的1字节对齐。
在VC中,可以这样定义1字节对齐的结构(结构在C/C++中称为struct):目前易语言支持调用任意复杂的DLL命令只要满足了前面的两个条件——调用方式为stdcall,参数结构为1字节对齐——易语言支持调用任意复杂的DLL命令:参数除了可以是基本数据类型或普通结构类型外,还可以是基本类型地址或基本类型数组,也可以是结构类型地址或结构类型数组,结构类型的成员中还可以包含任意数量和任意层次的其它结构、结构地址、结构数组,等等。
DLL命令调用表要在易语言中调用Windows API或普通DLL中的导出函数,必须首先在易语言中对该函数进行声明,声明的方式就是颇具易语言特色的“填写‘DLL命令调用表’”。
“DLL命令调用表”正确填写完毕之后,就可以象调用普通易语言子程序一样调用DLL命令了。
下面重点说明“DLL命令调用表”的填写。
在易语言中,选择菜单“插入→DLL命令”即可插入一个空白的“DLL命令调用表”。
当然还有其它操作方式,请参考易语言相关操作手册。
注:上表中所谓“实际(数据)类型”表示在生成该DLL的编程语言中参数或返回值的数据类型。
注1:固定长度的文本(如VB中的“Dim s As String * 32”或C/C++中的“char s[32];”)在易语言中应定义为相应长度的字节型数组,并传址。
注2:各编程语言之间数据类型相互对照的一般原则是“所占内存字节数相同”。
注3:VB的Integer,Bool均占两个字节内存,而易语言的“整数型”“逻辑型”均占四个字节内存,注意区分。
注4:如果不能确信其它编程语言中的某个数据类型对应易语言的哪个类型,可首先尝试“整数型”,然后可尝试“字节集”(注意使用前以“取空白字节集()”等命令分配足够的内存空间)。
注5:有些API(如FindWindow(A))的文本参数需要接收NULL值,有两种处理方案:在易语言中将该参数定义为整数型并传入0;在易语言中将该参数定义为文本型并传入“字符(0)”(在这里“字符(0)”类似于VB 中的vbNullString)。
自定义数据类型如果DLL命令中有参数为结构类型,就需要事先在易语言中定义与其对应的自定义数据类型。
定义自定义数据类型的成员,与定义DLL命令的参数基本相同(具体含义请参考上文),只是有一点不同:如果DLL命令参数为数组,将忽略“传址”设置并总是认为“传址”;但如果自定义数据类型成员为数组,“传址”与否有不同的含义。
此外,自定义数据类型的成员“数组”属性需指定一个明确的数值,而不象DLL命令参数那样仅仅设置一个标志。
在自定义数据类型的成员为数组时,如果设置“传址”,表示在此自定义数据类型中该成员位置处只存储数组数据的内存首地址;如果不设置传址,表示在此自定义数据类型中该成员位置处的数据为所有数组数据的顺序排放。
至于如何判断某自定义数据类型成员是否为“数组”及是否应该“传址”,则应视具体的自定义数据类型及其说明文档而定,有时还需考虑该成员的“语义”。
度分别为MAX_DEFAULTCHAR 和MAX_LEADBYTES,查VC相应头文件得知两个常量的值分别是2和12)。
错误及处理如果易语言运行时提示“无法找到指定DLL库文件***中的输出命令***”,往往会有以下几种情况:●DLL调用表中,填写“Dll库文件名”或“在Dll库中对应命令名”时出现打字错误;●指定的“Dll库文件名”不在当前目前,也不在Windows系统目录,也不在特定目录中;●指定的“Dll库文件名”中只有***A或***W函数,而没有***函数;●Dll编写时失误,没有导出相应的函数,或导出了类似“?test@@Y AHHH@Z”的奇怪函数(通常是因为忘记在C++中将该函数声明为extern “C”);如果易语言在运行时提示“调用DLL命令后发现堆栈错误”,通常是因为:●DLL调用表中,对该DLL命令的参数定义错误,或数据类型不准确,或多提供了参数,或少提供了参数;或错误使用了传址,或错误使用了数组;●如果某参数的类型为自定义类型,其成员定义错误,或数据类型不准确,或多提供了成员,或少提供了成员;或错误使用了传址,或错误使用了数组;●该DLL命令的调用方式并非stdcall——易语言目前不支持调用非stdcall调用方式的DLL命令,见上文;示例下面以几个具体的DLL的调用来说明其使用方法(重点是“DLL命令调用表”的填写)首先要说明是,要在易语言在调用系统API或普通DLL,必须要有欲调用函数详细说明。
对于系统API函数,微软的MSDN有详细的说明文档;网络上也有不少网友整理的针对VB的API函数说明。
对于普通DLL,其作者通常会附带相应的说明。
以下例子以网上流行较广的“VBAPI函数参考手册——BSL软件工作室”(CHM,中文)作为主要参考资料,以MSDN(英文)作为辅助资料——因为前者有的地方说明不够详细和深入,搜集的API也不十分全面。
首先看一个在易语言中调用API函数PolyBezier画赛贝尔曲线的例子。
因为PolyBezier需要一个“设备场景句柄”参数,所以还要引入另外两个API函数GetDC和ReleaseDC以分别获取和释放“设备场景句柄”。
我根据上表的VB声明,可以得知,GetDC位于动态库“user32”中,其实际函数名称为“GetDC”;其返回值类型是Long,对应易语言中的“整数型”;其参数hWnd的类型是Long,也对应易语言中的“整数型”,同时因为关键字ByVal的存在,表示该参数并非“传址”参数。
根据以上分析,可以得到以下易语言DLL调用表:根据上表的VB声明,可以得知,ReleaseDC位于动态库“user32”中,其实际函数名称为“ReleaseDC”;其返回值类型为Long,按说应该对应易语言中的“整数型”,但根据其语义(说明中明确指出返回值表示该函数是否执行成功,应是逻辑型值),我们选择将其定义为“逻辑型”——当然定义为“整数型”也是对的。
它的两个参数类型都是Long,对应易语言中的“整数型”,且都有ByVal关键字,表示并非传址。
根据以上分析,可以得到以下易语言DLL调用表:最后看PolyBezier的VB声明:根据上表,可以得知,PolyBezier函数位于动态库“gdi32”中;返回值类型为Long,根据语义我们选择定义为易语言中的“逻辑型”(理由同上);第一个和第三个参数都是Long,均对应易语言中的“整数型”;第二个参数,根据参数说明可知它是一个“指向POINTAPI结构数组的指针”,参数类型为“POINTAPI”(后面将为这个结构定义一个易语言自定义数据类型),“数组”,“传址”。
根据以上分种,得到了易语言DLL调用表:因为上面用到了结构POINTAPI,我们需要将它定义为易语言自定义数据类型。
它有两个成员,参数都是Long,对应易语言中的“整数型”:到此为止,已将所需的DLL命令及其自定义数据类型定义好了,下面就可以象调用易语言普通子程序一样调用这几个DLL命令了:其它的DLL命令调用表实例:注意上面两图的“在Dll库中对应命令名”一栏,命令最后都有一个字符“A”,在其VB声明中就可找出其来源:Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As LongDeclare Function GetOpenFileName Lib "comdlg32" Alias " GetOpenFileNameA" (lpofn As tagOFN) As Long小结:我们选择了几个比较复杂的、有代表性的DLL调用,详细分析并描述了从定义到调用的全过程。
希望本示例能够帮助用户理解并学会使用在易语言中调用DLL命令,同时希望本示例已经向用户展示出了易语言对DLL 调用的支持已足够完善并趋于完美。
下一步,易语言将封装所有常用的API及相应的自定义数据类型,以免去用户需自行定义DLL和自定义数据类型的繁索步骤,更加简化用户操作,届时,在易语言中调用API就会象在VC、Delphi或C++ Builder中一样方便快捷了。
总结本文比较详细地描述了易语言对支持调用DLL所提供的各种特性,总结了应用中可能出现的问题且给予了处理方案,并以示例的形式向用户展示了整个操作过程。
到目前为止,易语言对调用DLL所提供的支持已趋于完善,从理论说,可以支持调用几乎所有的Windows系统API。
在易语言中调用DLL应该说是一种比较高层次的应用。
易语言自身已经实现在绝大多数常用的Windows 系统API功能,对易语言普通用户(初级用户)而言,能接触到调用DLL的机会并不是太多。