- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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: "the parameter is incorrect"
请注意,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;
我根本不明白为什么会发生这个异常!
如果我在 TXMLHttpNet.PostRequest
中使用 VarToWideStr
显式地将 FReqXML
“转换”为 WideString
,则可以正常工作:
xmlHttp.send(VarToWideStr(FReqXML));
或者甚至像这样奇怪(!):
xmlHttp.send((FReqXML)); // note the double Brackets
问题:这里发生了什么?
据我所知,在这两种情况下 FReqXML
都是 WideString/BSTR
。
为什么 FReqXML
参数在两种情况下的行为不同?
最佳答案
您是对的,FReqXML
在这两种情况下具有相同的类型,但在后一种情况下,其内存是根据对象的内存(堆)分配的。根据 Delphi 版本和编译器设置,这可能会导致用于字符串的内存与仅用于本地使用(堆栈)的内存有不同的行为。这就是为什么 VarToWideStr
确实有效(奇怪的是,显然还有额外的括号)。
除此之外,我强烈建议导入 MSXML2 类型库并使用它。它使用早期绑定(bind),不仅提高了性能,还支持代码编辑器中的代码完成。
您可以使用类型库导入器来生成它,或者使用我拥有的副本 here .
然后,不要使用 OleVariant
和 CreateOleObject
(这会导致后期绑定(bind)),而是使用 CoServerXMLHTTP.Create
和 XMLHTTP
接口(interface)类型。
关于delphi - MSXML2.ServerXMLHTTP 与 BSTR 的后期绑定(bind) "send"方法失败,并显示 "the parameter is incorrect",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26398912/
在尝试与 C++ 函数中的 BSTR 字符串进行比较时,我遇到了无法弄清楚的访问冲突。不管出于什么原因,大部分时间代码运行正常。但有时,看似随机地,它会抛出异常。这就是我正在做的: BSTR mySt
我想调用一个 COM 方法,该方法需要一个 BSTR 数组和指定数组大小的单独参数,然后它会填充该数组。以下是否可以正常工作 - 它可以编译,但我想确定 &* 因为我知道 sys-strings 通常
我必须将 BSTR 转换为 C 中的 CHAR* 数据类型。是否有办法在不使用 VC++ 库或函数的情况下执行此操作。代码必须是纯 C 语言。我认为“comutil.h”有函数,但我想它们是 C++
开发者大家好 我已经在互联网上搜索了 2 天,了解如何做我需要做的事情,但我尝试了很多样本但没有成功。然而,这并不意味着我涵盖了所有网站 - 我认为我一只眼睛瞎了,另一只眼睛看不见。 无论如何,我
我有一个 out C++ COM dll 中接口(interface)的 BSTR* 值。我将此返回给 C# .Net 客户端。在我的 C++ 函数中,我必须根据差异条件分配不同的值。 例如: If
假设来自 COM 接口(interface)的方法返回 BSTR 值。我认为我必须释放它是对的吗? 的代码示例http://msdn.microsoft.com/en-us/library/aa365
如果BSTR,LPCOLESTR,LPCWSTR,LPTSTR,LPCWCHAR以及其他很多东西的含义都是一堆,这些定义仍然可以解析为wchar_t,那么它们的含义是什么? 最佳答案 LPTSTR和L
BSTR DoSOmething() { return L""; } 或者是否可以将 TCHAR * 传递给以 BSTR 作为输入参数的 API。 通过返回语句将 wchar_t 字符串转换为
BSTR DoSOmething() { return L""; } 或者是否可以将 TCHAR * 传递给以 BSTR 作为输入参数的 API。 通过返回语句将 wchar_t 字符串转换为
我需要将 Linux 应用程序连接到使用 bstr 数据的服务器。我可以“滚动”我自己的代码来制作 bstr 吗?我知道 bstr 的基础知识,它有一个字节大小减去空终止符的 header ,并且由于
我有一个测试函数如下: [TestMethod] void RipMichaelJacksonTest() { string expected = "Hello
我有两个指向 BSTR 的指针: BSTR *r1; BSTR *r2; 现在我想返回“r1 + r2”,但这是不可能的,因为它们不是字符串而是指针。我如何以正确的方式将它们组合成一个字符串? 最佳答
我有一个 BSTR,其中包含很多字符。 BSTR theFile = NULL; int res = comSmartspeak -> readTheFile(file
我在 Windows 7 上使用 iTunes COM 接口(interface)。iTunes.CurrentTrack.AddArtworkFromFile(path) 方法要求路径为 BSTR
至少常见的做法是将空 BSTR(空 WCHAR* 指针)视为空字符串,并相应地设计所有操作 BSTR 的代码。 this question的答案说同样的话。 这种做法记录在哪里?有官方文件描述这个约定
如果我有从非托管代码调用的托管 COM 接口(interface),我是负责在使用后释放内存还是由垃圾回收处理? public void WriteOutFile([In] [MarshalAs(U
在我正在处理的 c# 应用程序中,我正在使用 API 来提取客户信息,并试图获取用户电子邮件地址的字符串 - API 文档指出我可以在要提取的对象上调用以下内容返回一个注释域字符串(电子邮件地址只能从
我有这样一个函数: bool Function (BSTR paramter1, BSTR parameter2) { // My Code } 我这样调用它: Function(SysAll
考虑下面的代码,这里有内存泄漏吗? HRESULT GetPath(wstring &outDomainPath) { CComBSTR bstrDomainPath; Another
我有一个将文件写入 BSTR 的函数,但我不能将它写入包含编码的文件?这是我的函数,请指正! unsigned long Vnpt_WriteFile(const LPCTSTR pFilePath,
我是一名优秀的程序员,十分优秀!