如何使用所需的 BSTR* 参数正确调用 IDispatch::Invoke

2023-12-15

有很多关于如何使用 BSTR* 参数调用 IDispatch::Invoke 的示例。我将此与许多其他“SomeType *”参数一起使用,但无论我尝试什么,我要么得到类型不匹配的HRESULT,E_OUTOFMEMORY,要么得到访问冲突。在我看来,我的记忆出了问题,但我正在遵循我发现的不同示例......作为旁注,最后的“[out] UINTpuArgErr" 参数永远不会填充导致问题的参数索引。但是,我知道它是 BSTR 类型的第三个参数(我已成功调用另一个采用前面 2 个参数的方法。)

VARIANTARG* v = new VARIANTARG[3];
//...Init my first 2 args
//Code omitted for initializing args 1 and 2 and wrapping everything up to call IDispatch->Invoke

//... Variation 1
VariantInit(v[2]);
BSTR val = SysAllocString(L"");
v[2].vt = VT_BSTR | BT_BYREF;
v[2].pbstrVal = &val;
//When I wrap everything up in the call to IDispatch::Invoke 
//this yields a HRESULT of Type Mismatch

*

//...Variation 2
VariantInit(v[2]);
BSTR val = SysAllocString(L"");
v[2].vt = VT_BSTR | BT_BYREF;
v[2].bstrVal = val;
//When I wrap everything up in the call to IDispatch::Invoke 
//this yields a HRESULT of E_OUTOFMEMORY

*

//...Variation 3
VariantInit(v[2]);
BSTR val = SysAllocString(L"RandomStringLargerThanTheMethodWillPlaceInTheOutParam");
v[2].vt = VT_BSTR | BT_BYREF;
v[2].bstrVal = val;
//When I wrap everything up in the call to IDispatch::Invoke 
//this yields an access violation

*

//...Variation 4
VariantInit(v[2]);
BSTR val = 0;
v[2].vt = VT_BSTR | BT_BYREF;
v[2].bstrVal = val;
//When I wrap everything up in the call to IDispatch::Invoke 
//this yields and HRESULT of 0x800706f4 A null reference pointer 
//was passed to the stub. 

我不明白为什么当我遵循 BTR* 参数的其他示例时会发生这种情况...此外,我还有许多其他成功调用 IDispatch::Invoke 的方法,但这个 BTR* 让我陷入了停顿。

绝望了,请帮忙!

添加:

IDL 是: [id(0x00000171)] 简短的 GetCategory( 短 nIndx, 短* nCat, BSTR* bszName);


你们都走在正确的轨道上。 @HansPassant 评论让我想到了“额头一巴掌”“尤里卡”时刻,他猜测它会在不同的参数上爆炸。第一个和第二个参数的类型不同。反向传递给 ::Invoke 它们实际上是第二个和第三个参数。所以它实际上是因为类型不匹配而在我的“第一个”参数上爆炸了。

在我最初的概念验证版本中,我手动传递参数,并且有目的地按照 IDispatch::Invoke 的要求以相反的顺序正确传递参数。在将其转换为循环访问从调用者传递的参数数组的更通用方法的过程中,当我将它们返回到调用应用程序时,我在调用 IDispatch::Invoke 之后反转了参数顺序,但是,我忘记了反转它们在调用 Invoke 之前的途中。

神圣的“你知道什么”的错误对于没有丰富这方面经验的人来说是如此深奥!

一旦我修复了参数的顺序,一切都会完全按照预期运行。当然,我的问题中的“变体 1”是处理 BSTR* 参数的正确方法。为了清楚起见,下面是为 IDispatch::Invoke 调用的 BSTR* 参数初始化变量参数的正确方法(在我的例子中,还有 2 个其他参数未在此处显示)

VARIANTARG* v = new VARIANTARG[3];
//...Init my first 2 args IN REVERSE (not shown here)

//Init my third arg which is the BSTR* parameter
VariantInit(v[0]);
BSTR val = SysAllocString(L"");
v[0].vt = VT_BSTR | VT_BYREF;
v[0].pbstrVal = &val;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用所需的 BSTR* 参数正确调用 IDispatch::Invoke 的相关文章

  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • vs2008 c#:Facebook.rest.api如何使用它来获取好友列表?

    如何在此基础上取得进一步的进步 获取好友列表的下一步是什么 string APIKey ConfigurationManager AppSettings API Key string APISecret ConfigurationManag
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程

随机推荐

  • Android 5.x 快门速度

    我正在尝试获取受支持的快门速度参数 但我现在确定如何获取这些范围 对于 ISO 值 String supportIsoValues camParams get iso values 支持的值 逗号分隔的字符串 System out prin
  • Aptana 3 php 无法激活函数链接和变量辅助

    我刚刚升级到 Aptana 3 似乎失去了 Eclipse 中的一些强大功能 到目前为止我不知道如何重新启用它 具体来说 我需要重新打开这两个功能 FileUpload checkForExistingUploadPath somepath
  • Bash 脚本转换日期格式

    我正在寻找替换现有的日期格式 CCYY MM DD with MM DD CCYY使用 shell 脚本将日期格式存储在大文件中 在更改日期格式之前 它应该如下所示 2014 01 31 2014 01 31 更改日期格式后应该如下所示 0
  • 自定义 OWIN/Katana UserManager 工厂行为

    网上有很多使用 OWIN Katana 的示例 可以根据用户名 密码组合在数据库中查找用户并生成声明主体 例如 var userManager context OwinContext GetUserManager
  • 找到给定数字的所有因数的最佳方法

    所有能整除 x 的数字 我输入 4 它返回 4 2 1 编辑 我知道这听起来很家庭作业 我正在编写一个小应用程序 用半随机测试数据填充一些产品表 其中两个属性是 ItemMaximum 和 Item Multiplier 我需要确保乘数不会
  • 重塑数据框并创建相似度矩阵

    我有一个数据表 我尝试重塑它 但它不起作用 我该怎么做 我有一个数据表 Name Value Bob 8 9 10 Mike 2 3 4 Sandr 5 6 7 我如何将其放入一个列表中 例如 Value Name 2 Mike 3 Mik
  • 自动加载bitbucket存储库+composer.json

    我想使用 Composer 将 bitbucket 存储库添加到我的供应商文件夹中 这是我的composer json 中的内容 require silex silex 1 1 doctrine dbal 2 2 twig twig 1 s
  • 如何在 mysql 中查找日期时间行的时间增量?

    我在数据库中有一个列 它提供一系列传感器读数的日期时间戳 我想将这些读数分割成不间断的 连续的传感器读数组 如果传感器读数损坏 则日期时间列中将会出现中断 因此 我想对日期时间列执行查询 然后计算连续读数之间的差异 假设我的查询是 sele
  • Unity 5 中的 UnityScript“通用函数”

    在遵循其网站上的 Unity3D 教程时 http unity3d com learn tutorials projects roll a ball moving the player 我遇到过 通用函数 http docs unity3d
  • 配置 IntelliJ IDEA 以使用 JUnit 进行单元测试

    今天早上我决定通过试用版尝试一下 IntelliJ 并安装了 JUnit 插件 我创建了一个新的 Java 项目 我想为其编写一个测试用例 如何将 junit jar 文件添加到我的项目中 我实际上想将它添加到每个 java 项目中 现在和
  • Slim 框架:不允许使用方法 不允许使用方法。必须是以下之一:POST

    我正在 PHP 中设置 REST 服务器 并希望允许客户端使用具有不同方法的端点 例如 GET POST PUT DELETE 等 但是 当我尝试添加 POST 方法的函数时 出现了一个问题 如果我尝试通过 Postman 使用 POST
  • Xgboost 随机种子设置不能确保再现能力

    尽管设定了一个值random state and or seed参数 性能不可重现XgboostSklearn API 包装器 这是代码 from xgboost sklearn import XGBClassifier from skle
  • QWidget不绘制背景色

    我正在使用 PySide 1 2 1 和 Python 2 7 我需要一个小部件来绘制彩色背景 在 Qt Designer 中 我创建了一个简单的窗口 其中包含一个标签 一个包含三个其他项目的小部件和另一个标签 对于包含按钮 单选按钮和复选
  • 如何使 1 + 1 = 2 而不是 1 + 1 = 11 [重复]

    这个问题在这里已经有答案了 我试图以数学方式添加数字 但它不断添加后面的数字 它获取 id 编号 begen 然后获取另一个 div 内的编号 kacbegen var begen this attr id var kacbegen mat
  • 通过 CSS 选择器选择两个已知元素之间的所有元素

    我有两个已定义 id 的元素 它们之间有任何 html 例如 div Hello div div Example div hr a href Example a div World div 是否有 CSS 选择器可以选择 d1 和 d2 之
  • HTTP 状态 500 - Servlet appServlet 的 Servlet.init() 引发异常

    我想尝试一个简单的程序 但出现以下错误 我正在使用 Eclipse Kelper 和 Tomcat 7 0 尝试了很多事情 但没有什么对我有用 HTTP Status 500 Servlet init for servlet appServ
  • Firebase 安全规则阻止写入 Firebase

    注 此问题已标记 polymer 因为 Polymer 库用于生成 Javascript 这个问题是关于处理 Firebase 安全性的两个不同但相关的问题 在尝试让 Firebase 安全规则发挥作用时 问题 1 和问题 2 似乎提出了相
  • Javascript 通过匹配字符串对数组进行排序

    我有一个包含地理位置代码结果的数组 我想按与我搜索过的术语最接近的匹配项对其进行排序 例子 搜索 Pizza Array Pizza Uno Pizzeria Uno Burgers and Pizzeria Cino Pizzeria 排
  • 如何绕过 Swagger-UI 的身份验证?

    如何从浏览器绕过 Swagger UI 的令牌身份验证 我可以通过 Postman 向 Swagger UI 发出请求 当我从浏览器发出请求时 我收到错误 因为它请求令牌 http localhost 8080 swagger ui ind
  • 如何使用所需的 BSTR* 参数正确调用 IDispatch::Invoke

    有很多关于如何使用 BSTR 参数调用 IDispatch Invoke 的示例 我将此与许多其他 SomeType 参数一起使用 但无论我尝试什么 我要么得到类型不匹配的HRESULT E OUTOFMEMORY 要么得到访问冲突 在我看