我对MSXML2.ServerXMLHTTP
/有一个非常奇怪的行为MSXML2.XMLHTTP.3.0
。
问题出在send
方法上。哪个可以接受BSTR
//对象SAFEARRAY
/XMLDOC
IStream
这段代码运行良好并且工作了多年(FServiceUrl, FReqXML
命名的使用是有意的):
procedure PostRequest(const FServiceUrl, FReqXML: WideString);
var
xmlHttp: OleVariant;
begin
xmlHttp := CreateOleObject('MSXML2.ServerXMLHTTP.6.0');
xmlHttp.Open('POST', FServiceUrl, False);
// VarType(FReqXML) -> BSTR
xmlHttp.send(FReqXML);
end;
现在我需要将此过程包装到一个简单的类中:
type
TXMLHttpNet = class
private
FServiceUrl: WideString;
FReqXML: WideString;
public
constructor Create(const AServiceUrl, AReqXML: WideString);
procedure PostRequest;
end;
constructor TXMLHttpNet.Create(const AServiceUrl, AReqXML: WideString);
begin
FServiceUrl := AServiceUrl;
FReqXML := AReqXML;
end;
procedure TXMLHttpNet.PostRequest; // Problem is in this call
var
xmlHttp: OleVariant;
begin
xmlHttp := CreateOleObject('MSXML2.ServerXMLHTTP.6.0');
xmlHttp.Open('POST', FServiceUrl, False);
// VarType(FReqXML) -> BSTR
xmlHttp.send(FReqXML); // EOleException: "the parameter is incorrect"
end;
奇怪的xmlHttp.send(FReqXML);
是,上面一行引发了一个异常:
EOleException:“参数不正确”
请注意,FReqXML
两种情况下的类型都是相同的 ( WideString/BSTR
)
一个简单的测试:
uses ComObj;
procedure TForm1.Button1Click(Sender: TObject);
var
Request: TXMLHttpNet;
begin
// simple procedure
PostRequest('http://www.gmail.com', 'foo'); // OK!
// via object method
Request := TXMLHttpNet.Create('http://www.gmail.com', 'foo');
Request.PostRequest; // EOleException: "the parameter is incorrect"
Request.Free;
end;
我简直无法理解为什么会发生这个异常!
如果我明确地“转换”FReqXML
为WideString
with VarToWideStr
inTXMLHttpNet.PostRequest
它可以正常工作:
xmlHttp.send(VarToWideStr(FReqXML));
甚至奇怪的是这样(!):
xmlHttp.send((FReqXML)); // note the double Brackets
问题:这里发生了什么?
据我所知FReqXML
,WideString/BSTR
在这两种情况下都是。
为什么FReqXML
参数在两种情况下的行为不同?