TC官方合作论坛
标题:
dllcall 用法例子之下载者
[打印本页]
作者:
qfpaper
时间:
2014-3-1 16:25
标题:
dllcall 用法例子之下载者
空间 dllcalltest
//默认空间
变量 线程句柄=0
//dllcall参数说明
//函数原型:dllcall(filepath,type,functionName,...)
//filepath:api所在的一个dll的地址
//type:api返回值的类型
//functionName:api的名字,某些字符串相关的API在名字需要多加字母A或者W
//...:表示参数是动态的,后面的实际参数是根据API的具体参数来写的
//dllcall使用规则:
//1、调用系统API只需要写API所在的dll就可以了,可以不写绝对路径,自己编写的API必须使用绝对路径
//2、 dllcall的参数在TC里面的定义:
//TC代码中的参数
//MSDN中的参数
//wchar *
//LPCWSTR
//char *
//LPTSTR LPCTSTR
//double
//DOUBLE FLOAT
//int
//INT LONG
//bool
//BOOL
//3、参数的个数以及类型必要与MSDN上相对应
//4、dllcall暂时还不支持参数传址与结构体
功能 下载文件(pCaller,szURL,szFileName,dwReserved,lpfnCB)
//VB
//Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA"
//(ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String,ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
//Return Value
//Returns one of the following values.
//S_OK : The download started successfully.
//E_OUTOFMEMORY: The buffer length is invalid, or there is insufficient memory to complete the operation.
//INET_E_DOWNLOAD_FAILURE:The specified resource or callback interface was invalid.
返回值=dllcall("urlmon.dll","int","URLDownloadToFileA","int",pCaller,"char *",szURL,"char *",szFileName,"int",dwReserved,"int",lpfnCB)
如果(返回值==0)
返回 真
否则
返回 假
如果结束
功能结束
功能 打开文件(lpCmdLine,nCmdShow)
//VB
//Declare Function WinExec Lib "kernel32" Alias "WinExec" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long
//返回值
//Long,大于31表示成功,请参考FindExecutable函数
返回值=dllcall("kernel32.dll","int","WinExec","char *",lpCmdLine,"int",nCmdShow)
调试输出("打开文件返回值数值:"&返回值)
如果(返回值>31)
返回 真
否则
返回 假
如果结束
功能结束
功能 主功能()
Url="http://www.52kanpai.com/test.exe"
UrlToFlie="c:\\test.exe"
是否下载成功=dllcalltest.下载文件(0,Url,UrlToFlie,0,0)
如果(是否下载成功)
调试输出("下载成功,返回值:"&是否下载成功)
是否打开成功=dllcalltest.打开文件(UrlToFlie,1)
如果(是否打开成功)
调试输出("成功打开文件")
否则
调试输出("打开文件失败")
如果结束
否则
调试输出("下载失败,返回值:"&是否下载成功)
如果结束
功能结束
功能 开启下载线程_点击()
//这里添加你要执行的代码
如果(线程句柄==0)
线程句柄=线程.开启("dllcalltest.主功能","")
如果结束
功能结束
//空间结束语句
功能 结束下载线程_点击()
//这里添加你要执行的代码
线程.关闭(线程句柄)
线程句柄=0
功能结束
空间结束
复制代码
作者:
qfpaper
时间:
2014-3-1 16:31
我的理解是,编程就是调用系统提供的API接口做一些我们想做的事情。。。。
TC的DLLCALL 功能对于功能的扩展有很大的帮助啦,方便直接用TC扩展程序功能。。。
但是,为什么TC只能编写EXE形态的程序呢? 例如DLL就不支持。。
很多情况下需要用DLL的,例如DLL劫持。。。小伙伴们都懂的。。
而像易语言就可以写DLL。。
不知道TC啥时候加上呢?
作者:
jimye0526
时间:
2014-3-1 16:37
这不一样tc只是为了脚本开发,是一门脚本语言
而易语言是为了开发一门中文编程语言而开发的,类似vb的中文版,但是有自个的编译器,不是解释型语言
作者:
jimye0526
时间:
2014-3-1 16:37
本帖最后由 jimye0526 于 2014-3-1 16:39 编辑
_____
作者:
qfpaper
时间:
2014-3-1 16:41
但是,有时候注入后才方便,注入又是DLL才方便。 那TC不能玩DLL啊。。
作者:
冷月无痕
时间:
2014-3-1 21:05
你可以用E写DLL 然后TC调用
作者:
qfpaper
时间:
2014-3-2 07:56
1. 静态调用方式
示例程序创建了一个DLL,其中仅包含一个求两个整数的和的函数,在主程序中输入两个整数,通过调用该DLL,即可求出两个整数的和
library AddNum;
uses
SysUtils,
Classes;
{$R *.res}
function AddNumber(Num1,Num2:integer):integer;stdcall; //定义求和函数
begin
result:=Num1+Num2;
end;
exports
AddNumber; //引出求和函数
begin
end.
复制代码
主程序在调用该DLL时,首先在interface部分声明要调用的函数:
function AddNum(Num1,Num2:integer):integer;stdcall;external 'AddNum.dll'
name 'AddNumber';
复制代码
然后在按钮控件的事件中写入如下代码:
procedure TForm1.Button1Click(Sender: TObject);
var
Number1,Number2:integer;
Sum:integer;
begin
Number1:=strtoint(Edit1.Text);
Number2:=strtoint(Edit2.Text);
Sum:=AddNum(Number1,Number2); //调用求和函数计算结果
Edit3.Text:=inttostr(Sum);
end;
复制代码
2.动态调用方式
这个示例程序创建了一个显示日期的DLL,其中包含一个窗体。
程序中定义了一个ShowCalendar函数,返回在这个窗体中设定的日期。函数定义如下
function ShowCalendar(AHandle: THandle; ACaption: String): TDateTime;
var
DLLForm: TDLLForm;
begin
Application.Handle := AHandle;
DLLForm := TDLLForm.Create(Application); //创建并显示窗体
try
DLLForm.Caption := ACaption;
DLLForm.ShowModal; //显示方式为模式化
Result := DLLForm.calDLLCalendar.CalendarDate; //返回设定日期
finally
DLLForm.Free; //用完后卸载该窗体
end;
end;
复制代码
在DLL的工程文件中用exports ShowCalendar; 语句引出该函数。下面通过一个简单的应用程序测试一下该DLL文件。新建一个工程文件,在窗体中放置一个Label控件和一个按钮控件,在按钮控件的OnClick事件中编写如下代码:
procedure TMainForm.Button1Click(Sender: TObject);
var
OneHandle : THandle; //定义一个句柄变量
begin
OneHandle := LoadLibrary('Clendar.dll'); //动态载入DLL,并返回其句柄
try
if OneHandle <> 0 then //如果载入成功则获取ShowCalendar函数的地址
@ShowCalendar := GetProcAddress(OneHandle, 'ShowCalendar');
if not (@ShowCalendar = nil) then
//如果找到该函数则在主窗体的Label1中显示DLL窗体中设定的日期
Label1.Caption := DateToStr(ShowCalendar(Application.Handle, Caption))
else
RaiseLastWin32Error;
finally
FreeLibrary(OneHandle); //调用完毕收回DLL占用的资源
end;
end;
复制代码
以上为DELPHI中调用DLL的两种方法,DLLCALL方法对比后发现等同于静态调用。TC貌似不可以动态调用。。
没有 LoadlibraryA. GetProcAddress
欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/)
Powered by Discuz! X3.1