日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++接口注意

發(fā)布時(shí)間:2023/12/10 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++接口注意 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 用Record接口,要注意?Packed的區(qū)別

2. cdeclstdcall的區(qū)別

3. C++導(dǎo)出的函數(shù)建議用C格式stdcall導(dǎo)出,使用Def文件定義名稱

4. 用VS寫的API dll要注意是否引用了MFC的DLL,否則會(huì)使LoadLibrary失敗,并GetLastError后返回14001

Api頭文件 ////?代理信息結(jié)構(gòu)?//
struct?DOWNLOAD_PROXY_INFO
{
????
int????m_type;????????????//代理服務(wù)器類型,0:HTTP;?1:SOCKS4;?2:SOCKS4a
????char????m_host[32];????????//代理服務(wù)器地址
????int????m_port;????????????//代理服務(wù)器端口
????char????m_userName[52];????????//代理服務(wù)器驗(yàn)證用戶名稱
????char????m_password[52];????????//代理服務(wù)器驗(yàn)證用戶密碼
};
////?任務(wù)節(jié)點(diǎn)結(jié)構(gòu)?//
struct?TASK_NODE
{
????
int????m_id;????????????//任務(wù)id
????char????m_url[1024];????????//目標(biāo)URL,不能為空
????char????m_path[256];????????//存儲(chǔ)目錄,不能為空
????bool????m_isReload;????????//是否重新下載,用于斷點(diǎn)續(xù)傳
????char????m_fileName[32];????????//另存名稱,可以為空,為空文件名同下載的文件名
????char????m_comments[1024];????//下載注釋,可以為空
????int????m_startMode;????????//開始模式,0手工開始,1立即開始
????int????m_threadCount;????????//下載線程數(shù)
????int????m_failedRetryCount;????//失敗重試次數(shù)
????int????m_failedRetryInterval;????//失敗重試間隔,毫秒
};
////?回調(diào)函數(shù)指針?//
typedef?void?(WINAPI?*CALL_BACK)(int?taskID,?TASK_INFO?*pTaskInfo);


////?接口函數(shù)?//
/*?
????1.初始化函數(shù)
????參數(shù):????maxFlow:流量的最大值,單位K/S。范圍0<maxFlow<1024
????????????pCallback:回調(diào)函數(shù),格式見下CallBackFunction
????????????isUseProxy:是否使用代理,false:不使用用;true:使用。默認(rèn)不使用
????????????pProxyInfo:代理類型結(jié)構(gòu)指針,其結(jié)構(gòu)見DOWNLOAD_PROXY_INFO,默認(rèn)空
????返回值:????-1:初始化失敗;其他值為使用者的ownerID
????注意事項(xiàng):????此函數(shù)必須首先調(diào)用
*/
HDL_EXTERN?
int?HDL_EXPORTS?WINAPI?DownLoadInitial(int?maxFlow,?CALL_BACK?pCallback,?bool?isUseProxy?=?false,?DOWNLOAD_PROXY_INFO?*pProxyInfo?=?NULL);

/*?
????2.設(shè)置最大流量函數(shù)
????參數(shù):????ownerID:使用者ID
????????????maxFlowNum:新設(shè)置的最大流量值。范圍0<maxFlow<1024
????返回值:????-1:失敗;1:成功
接口引用 type
??TTAQEXPProxy?
=?record
????m_
type:?Integer;
????m_host:?
array[0..31]?of?char;
????m_port:?Integer;
????m_userName:?
array[0..51]?of?char;
????m_password:?
array[0..51]?of?char;
????m_domain:?
array[0..51]?of?char;
??
end;
??PTAQEXPProxy?
=?^TTAQEXPProxy;
??TTAQEXPTASK_NODE?
=?record
????m_id:?integer;
????m_url:?
array[0..1023]?of?char;
????m_path:?
array[0..255]?of?char;
????m_isReload:?Boolean;
????m_fileName:?
array[0..31]?of?char;
????m_comments:?
array[0..1023]?of?char;
????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;

procedure?DoCallBack(ID:?integer;?Data:?PTAQEXPTask_INFO);stdcall;
begin
??TTAQEXPManager.GetInstance.DoUpdatePercent(ID,Data);
end;

procedure?TTAQEXPDownloader.InitDll;
var
??LInit:?TDownLoadInitial;
??LProxy:?PTAQEXPProxy;
??LMAX:?Integer;

begin
??
if?not?FstateFlag?then?Exit;
??new(LProxy);
??fillchar(LProxy^,sizeof(TTAQEXPProxy),
0);
??LInit?:
=?TDownLoadInitial(
????GetProcAddress(FDllHandle,?PChar(
'DownLoadInitial')));
??
if?Assigned(LInit)?then
??
begin
????
if?TTAQEXPManager.GetInstance.Config.Loaded?then
??????LMAX?:
=?TTAQEXPManager.GetInstance.Config.FlowMax
????
else
??????LMax?:
=?128;
????
if?LMAX?<?1?then?LMAX?:=128;??
????
if?CreateConfig.ProxyEnable?then
????
begin
??????
case?CreateConfig.ProxySocksVersion?of
??????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);
????
if?FOwnerId?=?-1?then
????
begin
??????FstateFlag?:
=?False;
??????DoLog(
'DownLoadInitial失敗');
????
end;
??
end
??
else
??
begin
????FstateFlag?:
=?False;
????Dolog(
'沒有函數(shù):DownLoadInitial');
??
end;
end;

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/enli/archive/2010/08/30/1812748.html

總結(jié)

以上是生活随笔為你收集整理的C++接口注意的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。