NETANTS.API带的c源代码中variant到Delphi的转换问题(100分)

  • 主题发起人 郑海山
  • 开始时间

郑海山

Unregistered / Unconfirmed
GUEST, unregistred user!
Netants.API带的源代码调用格式如下:
void IAntAPIObj::AddUrlList(VARIANT* pList)
{
static BYTE parms[] =
VTS_PVARIANT;
InvokeHelper(0x2, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
pList);
}
代码如下:
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements =5;
SAFEARRAY * psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
if (psa == NULL) return;

LONG ix;
COleVariant var;

ix = 0;
var.SetString(_T("http://www.netants.com"), VT_BSTR);
SafeArrayPutElement(psa, &ix, &var);

ix = 1;
var.SetString(_T("http://www.netants.com/netants.exe"), VT_BSTR);
SafeArrayPutElement(psa, &ix, &var);

ix = 2;
var.SetString(_T("NetAnts 1.0"), VT_BSTR);
SafeArrayPutElement(psa, &ix, &var);

ix = 3;
var.SetString(_T("http://www.netants.com/addon_sample.exe"), VT_BSTR);
SafeArrayPutElement(psa, &ix, &var);

ix = 4;
var.SetString(_T("NetAnts 1.0 AddOn Sample"), VT_BSTR);
SafeArrayPutElement(psa, &ix, &var);

VARIANT vList;
vList.vt = VT_ARRAY;
vList.pparray = &psa;

AntObj.AddUrlList(&vList);

SafeArrayDestroy(psa);

VB的调用如下:
Dim pList(4)

'AddUrlList : Add many jobs to NetAnts
'pList : Url-Comment array and HTTP referer(Referer, Url, Comment, Url, Comment...)

pList(0) = "http://www.netants.com"
pList(1) = "http://www.netants.com/netants.exe"
pList(2) = "NetAnts 1.0"
pList(3) = "http://www.netants.com/addon_sample.exe"
pList(4) = "NetAnts 1.0 AddOn Sample"

AntObj.AddUrlList pList
请问如何转换成Delphi代码,我已经试过多种方法了,比如
定义一个PChar数组,定义一个String,然后用#0分开每个字符串,
定义一个variant,然后使用VarArrayCreate([0, 4], varOleStr),
都不行!


 
兄弟啊,要用variant数组才行
首先要用vararraycreate()来建立一个variant数组
至于为什么要用varOleStr,delphi的帮助中说得很清楚了
he element type of the array, given by the VarType parameter, must be one of the TVarData
type codes, and cannot include the varArray or varByRef bits. The element type cannot be
varString. To create a Variant array of strings use the varOleStr type code. If the element
type is varVariant, the elements of the array are themselves Variants and can in turn
contain Variant arrays.

procedure TForm1.Button1Click(Sender: TObject);
var
na:Variant;
plist:Variant;
begin
plist:=VarArrayCreate([1,4],varOleStr);
plist[1]:='http://203.207.176.1';
plist[2]:='http://203.207.176.2';
plist[3]:='http://203.207.176.3';
plist[4]:='http://203.207.176.4';
CoInitialize(nil);
try
Na := CreateOleObject('netants.api');
if VarType(na) <> varDispatch
then raise Exception.Create('Cannot connect to NetAnts');
na.addurllist(plist);//还是会出现访问对象错误,不知道如何解决
finally
CoUninitialize;
end;
end;
end;
 
honghs,我开始也是用你这种办法,不过不行的说!根本加不进去。
 
我随便试的时候,有一次是可以弹出netants的批量增加对话框,但是那个数组的值一个也没传过来。
不过忘记改动那可以弹出批量增加对对话框了,555
 
sigh,那怎么办!这原因在哪里?

又:NETANTS的作者提供的API功能太少了呵呵。居然没有保存为xx文件名的。
 
有netAnts的源码?给我一份!
呵呵 delphijoe@163.net
 
jackliew,我指的源代码是NetAnts.API的调用格式的源代码,叫
addon_sample_vb.zip addon_sample_vc.zip
他的主页上有下载,如果你还要的话我可以给你,

 
我調用成功了!

不過主要是修改 c 的方法,調用 SafeArrayCreate & SafeArrayPutElement ,然後
再轉成 OleVariant 來調用。


看誰有辦法轉成純粹使用 OleVariant 的吧,畢竟我們是 Delphi 人嘛。




底下為將 memo1 內的文字都呼叫 NetAnts.




procedure TForm1.BitBtn14Click(Sender: TObject);
var
//opList:OleVariant;
i : integer;

plist:OleVariant;

vg:SAFEARRAYBOUND;
psa:pSafeArray;

ix:integer;

os:OleVariant;
begin
//
if memo1.Lines.count<1 then
exit;


try
iAnt:=CoAntAPIObj.Create;
except
ShowMessage('無法調用 NetAnts.....');
exit;
end;


try
// 單一呼叫
//iAnt.AddUrl('http://www.kimo.com.tw/index.shtml','註解','http://www.kimo.com.tw/');

vg.lLbound:=0;
vg.cElements:=memo1.lines.count*2+1;

psa:=SafeArrayCreate(VT_VARIANT, 1, vg);
if psa=nil then
begin
exit;
end;
try

ix:=0;

os:=WideString(RefCombo1.text);
SafeArrayPutElement(psa,ix,os);

for i := 0 to memo1.Lines.count-1 do
begin
// 網址
os:=WideString(memo1.lines);
inc(ix);
SafeArrayPutElement(psa,ix,os);

// 註解
os:='CalcURLs call';
inc(ix);
SafeArrayPutElement(psa,ix,os);
end; // for

TVarData(pList).VType:=varArray;
TVarData(pList).VArray:=@psa;

iAnt.AddUrlList(plist);

finally
SafeArrayDestroy(psa);
end;

finally
iAnt:=nil;
end;
end;
 
请继续或结束
 
接受答案了.
 
接受答案了.
 
顶部