- 用Record接口,要注意 Packed的区别
2.cdecl和stdcall的区别
- C++导出的函数建议用C格式stdcall导出,使用Def文件定义名称
4. 用VS写的API dll要注意是否引用了MFC的DLL,否则会使LoadLibrary失败,并GetLastError后返回14001
Api头文件//////////////////// 代理信息结构//////////////////////////////////////////
structDOWNLOAD_PROXY_INFO
{
intm_type;//代理服务器类型,0:HTTP; 1:SOCKS4; 2:SOCKS4a
charm_host[32];//代理服务器地址
intm_port;//代理服务器端口
charm_userName[52];//代理服务器验证用户名称
charm_password[52];//代理服务器验证用户密码
};
//////////////////// 任务节点结构//////////////////////////////////////////
structTASK_NODE
{
intm_id;//任务id
charm_url[1024];//目标URL,不能为空
charm_path[256];//存储目录,不能为空
boolm_isReload;//是否重新下载,用于断点续传
charm_fileName[32];//另存名称,可以为空,为空文件名同下载的文件名
charm_comments[1024];//下载注释,可以为空
intm_startMode;//开始模式,0手工开始,1立即开始
intm_threadCount;//下载线程数
intm_failedRetryCount;//失败重试次数
intm_failedRetryInterval;//失败重试间隔,毫秒
};
//////////////////// 回调函数指针//////////////////////////////////////////
typedefvoid(WINAPICALL_BACK)(inttaskID, TASK_INFOpTaskInfo);
//////////////////// 接口函数//////////////////////////////////////////
/
1.初始化函数
参数: maxFlow:流量的最大值,单位K/S。范围0<maxFlow<1024
pCallback:回调函数,格式见下CallBackFunction
isUseProxy:是否使用代理,false:不使用用;true:使用。默认不使用
pProxyInfo:代理类型结构指针,其结构见DOWNLOAD_PROXY_INFO,默认空
返回值: -1:初始化失败;其他值为使用者的ownerID
注意事项: 此函数必须首先调用
/
HDL_EXTERNintHDL_EXPORTS WINAPI DownLoadInitial(intmaxFlow, CALL_BACK pCallback,boolisUseProxy=false, DOWNLOAD_PROXY_INFOpProxyInfo=NULL);
/
2.设置最大流量函数
参数: ownerID:使用者ID
maxFlowNum:新设置的最大流量值。范围0<maxFlow<1024
返回值: -1:失败;1:成功接口引用type
TTAQEXPProxy=record
m_type: Integer;
m_host:array[0..31]ofchar;
m_port: Integer;
m_userName:array[0..51]ofchar;
m_password:array[0..51]ofchar;
m_domain:array[0..51]ofchar;
end;
PTAQEXPProxy=^TTAQEXPProxy;
TTAQEXPTASK_NODE=record
m_id: integer;
m_url:array[0..1023]ofchar;
m_path:array[0..255]ofchar;
m_isReload: Boolean;
m_fileName:array[0..31]ofchar;
m_comments:array[0..1023]ofchar;
m_startMode: integer;
m_threadCount: integer;
m_failedRetryCount: integer;
m_failedRetryInterval: integer;
end;
PTAQEXPTask_Node=^TTAQEXPTASK_NODE;
TTAQEXPDLLCALLBACK=procedure(ID: integer; Data: PTAQEXPTask_INFO);stdcall;
TDownLoadInitial=function(Amaxflow: integer; ACallBack: Pointer;
POwnerName: pchar; AUserProxy: Bool; AProxy: PTAQEXPProxy; LogLevel: integer): Integer;stdcall;
procedureDoCallBack(ID: integer; Data: PTAQEXPTask_INFO);stdcall;
begin
TTAQEXPManager.GetInstance.DoUpdatePercent(ID,Data);
end;
procedureTTAQEXPDownloader.InitDll;
var
LInit: TDownLoadInitial;
LProxy: PTAQEXPProxy;
LMAX: Integer;
begin
ifnotFstateFlagthenExit;
new(LProxy);
fillchar(LProxy^,sizeof(TTAQEXPProxy),0);
LInit :=TDownLoadInitial(
GetProcAddress(FDllHandle, PChar('DownLoadInitial')));
ifAssigned(LInit)then
begin
ifTTAQEXPManager.GetInstance.Config.Loadedthen
LMAX :=TTAQEXPManager.GetInstance.Config.FlowMax
else
LMax :=128;
ifLMAX<1thenLMAX :=128;
ifCreateConfig.ProxyEnablethen
begin
caseCreateConfig.ProxySocksVersionof
svSocks4:
LProxy^.m_type:=1;
svSocks4A:
LProxy^.m_type:=2;
else
LProxy^.m_type:=0;
end;
strpcopy(LProxy^.m_host, CreateConfig.ProxyHost);
LProxy^.m_port :=strtointdef(CreateConfig.ProxyPort,80);
strpCopy(LProxy^.m_userName, CreateConfig.AuthUsername);
strpCopy(LProxy^.m_password, CreateConfig.AuthPassword);
strpCopy(LProxy^.m_domain, CreateConfig.AuthDomain);
FOwnerId :=LInit(LMAX, @DoCallBack,pchar(ConConfigName), True, LProxy,0);
end
else
FOwnerId :=LInit(LMAX, @DoCallBack,pchar(ConConfigName), false, LProxy,0);
ifFOwnerId=-1then
begin
FstateFlag :=False;
DoLog('DownLoadInitial失败');
end;
end
else
begin
FstateFlag :=False;
Dolog('没有函数:DownLoadInitial');
end;
end;
原文链接: https://www.cnblogs.com/enli/archive/2010/08/30/1812748.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14472
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!