是否可以在 SAFEARRAY 中编组 ref 参数

2024-02-13

这是我的 C# 服务器方法:

public void Exec(out int status, string output)
{
     status = 3;
     Console.WriteLine("Exec({0}, ...)", status);

     output = string.Format("Hello from .NET {0}", DateTime.Now);
     Console.WriteLine("Exec(..., {0})", output);         
}

我的 C++ 客户端正在设置并调用此方法。这工作正常,但状态和输出变量似乎没有链接。就好像它们是按值而不是按引用传递的。

这是我的客户端代码:

InitCLR();

LONG index = 0;

LONG i1 = 12; // just some number for testing
BSTR s1 = SysAllocString(L"Hello world");

SAFEARRAY* args = NULL;
CHECK_HRESULT( SafeArrayAllocDescriptor(1, &args) );

args->cbElements = sizeof(VARIANT);
args->rgsabound[0].lLbound = 0;
args->rgsabound[0].cElements = 2;

CHECK_HRESULT( SafeArrayAllocData(args) );   

// byref not working for in/out param   
VARIANT arg1;
VariantInit(&arg1);
V_I4REF(&arg1) = &i1;
V_VT(&arg1) = VT_I4 | VT_BYREF;   

// byref not working
VARIANT arg2;
VariantInit(&arg2);  
V_BSTR(&arg2) = SysAllocString(L"Hello world");
V_VT(&arg2) = VT_BSTR;   

index = 0;
CHECK_HRESULT( SafeArrayPutElement(args, &index, &arg1) );

index = 1;
CHECK_HRESULT( SafeArrayPutElement(args, &index, &arg2) );

int bindingFlags = mscorlib::BindingFlags_InvokeMethod |
  mscorlib::BindingFlags_Instance |
  mscorlib::BindingFlags_Public;

VARIANT retval;
VariantInit(&retval);

bstr_t methodName("Exec");
HRESULT hRes = Type->InvokeMember_3(
  methodName,
  static_cast<mscorlib::BindingFlags>(bindingFlags),
  NULL, // binder *
  Instance,
  args,
  &retval);

_tprintf(TEXT("Exec() == 0x%x\n"), hRes);

_tprintf(TEXT("i1=%d\n"), i1);

有人可以提供设置 SAFEARRAY 参数的帮助,以便将“ref”参数复制回来吗?


我可能不知道完整的答案,但我在您的代码中发现了两件事:

字符串未通过引用正确传递

C# 中的字符串是不可变的引用对象。这意味着对它们的引用是(按值)传递的,并且一旦创建了字符串,就无法修改它。如果修改字符串值,实际上会创建一个新字符串并更改对其的本地引用。

关于它有一个很好的解释here https://stackoverflow.com/a/10792823/3070052

因此,您需要将 C# 函数的定义更改为如下所示:

public void Exec(out int status, out string output)
{
    ...
}

你应该使用 ref 而不是 out

您似乎初始化了参数值beforeC# 函数调用不是函数本身。

所以,你应该使用 ref 而不是 out 关键字;

public void Exec(ref int status, ref string output)
{
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 SAFEARRAY 中编组 ref 参数 的相关文章

  • Lego Mindstorm NXT 的 C# 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有适用于 Lego Mindstorm NXT 的最新 C NET 库 NXT NET 乐高头脑风暴 最后更新时间 2008 年 4
  • asp.net-mvc 中模型绑定双精度的 CultureInfo 问题(2)

    在我的 Jquery 脚本中 我使用浏览器的 CultureInfo en UK 发布了两个双打 该浏览器使用 作为分数分隔符 我的 MVC 应用程序在区域设置为 nl BE 的服务器上运行 使用 作为分数分隔符 AcceptVerbs H
  • WatiN pressTab 不按 Tab

    有没有人找到了在 Internet Explorer 中使用 watiN 按 Tab 键的方法 您的意思是要按 Tab 键本身 还是只是单击看起来像 Tab 的 HTML 元素 对于后者 请对适当的元素 Div Span 等 使用 Clic
  • 向 Windows 服务发送 Windows 消息

    有没有任何工具可以将 WM ENDSESSION 等 Windows 消息发送 模仿 到 Windows 服务 OR 如何使用 C 向进程发送 Windows 消息 我只懂C 编辑 目的 基本上我必须调试 Windows 服务来修复仅在系统
  • 本地计算机上的服务启动然后停止,某些服务如果没有被其他服务或程序使用则自动停止

    我创建了一个示例 Windows 服务并成功安装了我的服务 但是在要启动服务时 我收到以下错误 本地计算机上的此服务启动然后停止 如果其他服务或程序未使用某些服务 则会自动停止 我的配置文件代码
  • 如何将 RTF 文件转换为 pdf 文件?

    如何将 RTF 文件转换为 PDF 文件 我有 adobe PDF 打印机 我应该使用它吗 如果是这样 我如何以编程方式访问它 您可以使用 PDF 打印机 但仍有一些问题需要解决 为了处理跨多个页面的文本 您需要本文 http msdn m
  • Request.Url.Query 和 Request.QueryString 有什么区别?

    我一直在追踪 URL 重写应用程序上的错误 该错误表现为查询字符串中某些变音符号的编码问题 基本上 问题是基本上 search aspx search he m nek 的请求被 search he c5 99m c3 a1nek 的查询字
  • 如何在 Visual Studio 2015 中为多个解决方案和项目设置单个 Nuget 包文件夹

    我们正在 Visual Studio 2015 中开发多个解决方案 这些解决方案共享一些需要 nuget 包的核心项目 当从一个解决方案添加 nuget 包并随后由另一解决方案打开时 无法解析 nuget 引用 文件夹结构如下 Codeba
  • 使用 EntityFramework 使用空参数值调用存储过程

    我在 sqlserver 2008 上有一个存储过程 其中一个参数接受空值 我不知道如何使用参数上的空值来调用该 SP 为了获得更多上下文 我正在使用 EntityFramework 6xx 在下一个示例中 参数 status Compat
  • 最佳实践:从属性中抛出异常

    什么时候适合从属性 getter 或 setter 中抛出异常 什么时候不合适呢 为什么 关于这个主题的外部文档的链接会很有帮助 谷歌搜索结果出奇的少 Microsoft 在以下位置提供了有关如何设计属性的建议 http msdn micr
  • Powershell“特殊”开关参数

    我有下面的powershell功能 Function Test Param Parameter string Text default text Write Host Text Text 我希望能够像下面这样调用这个函数 测试 文本 应该在
  • 如何以编程方式检索“Program Files”文件夹的实际路径? [复制]

    这个问题在这里已经有答案了 可能的重复 C 如何在 Windows Vista 64 位上获取程序文件 x86 https stackoverflow com questions 194157 c sharp how to get prog
  • 如何在.NET中扩展环境变量%CommonProgramFiles%\system\

    我遇到一种情况 我需要通过读取注册表设置来返回目录路径 注册表值返回我以下格式的路径 CommonProgramFiles System web32 dll 而消费者代码期望它的格式为 C Program Files Common File
  • Sqlite 删除速度极其慢 - 如何加快速度?

    我读到删除操作很慢 我想知道如何改进此检查 我有一个每天填充 10 15k 行的表 每次启动时我都需要清理所有超过 6 个月的记录 但是当数据库增长时 我开始遇到速度问题 当我运行此命令时 有接近 100 万条记录 即使我没有任何内容要删除
  • 使用 .NET 在 Windows 中创建弹出式“烤面包机”通知

    我正在使用 NET 并创建一个桌面应用程序 服务 当触发某些事件时 它将在桌面的一角显示通知 我不想使用常规的消息框 b c 那样会造成太大的干扰 我希望通知滑入视图 然后在几秒钟后淡出 我正在考虑一种类似于 Outlook 收到新邮件时发
  • C# 中将一个字符串拆分为另一个字符串

    我一直在使用Split 分割字符串的方法 但这似乎仅在您按字符分割字符串时才有效 有没有办法分割一个string 另一个字符串是按参数分割的 我尝试将拆分器转换为字符数组 但没有成功 换句话说 我想分割string THExxQUICKxx
  • .net MVC 将 MP4 流式传输到 iDevice 问题

    我一直在编写用于提供视频服务的一段代码 但遇到了一些问题 代码如下 public ResumingFileStreamResult GetMP4Video string videoID if User Identity IsAuthenti
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • TPL 数据流块下游如何获取源生成的数据?

    我正在使用 TPL Dataflow 处理图像 我收到处理请求 从流中读取图像 应用多次转换 然后将生成的图像写入另一个流 Request gt Stream gt Image gt Image gt Stream 为此 我使用块 Buff
  • System.IO.Compression 和 ZipFile - 提取并覆盖

    我使用标准 VB NET 库来提取和压缩文件 它也可以工作 但是当我必须提取并且文件已经存在时 问题就出现了 我使用的代码 Imports Imports System IO Compression 崩溃时我调用的方法 ZipFile Ex

随机推荐

  • SQL 查询游程长度或连续相同值编码

    我的目标是获取一组按顺序排序的数据id并返回一个结果集 该结果集指示连续行数val列是相同的 例如 鉴于此数据 id val 1 33 2 33 3 44 4 28 5 44 6 44 我想看到这个结果 id val run length
  • 多页 tiff 的简单 WPF 页面选择

    我正在制作一个基本的 Tiff 查看器 需要能够选择要查看的页面 在 Winforms 中 我可以使用 selectActiveFrame 所以我想知道是否有一个与此等效的 WPF 谢谢 编辑 在winforms中 我在selectActi
  • 如何使用boto读取S3上的二进制文件?

    我在 S3 文件夹 私人部分 中有一系列 Python 脚本 Excel 文件 如果它们是公开的 我可以通过 HTTP URL 读取访问它们 想知道如何以二进制方式访问它们以执行它们 FileURL URL of the File host
  • Android Phonegap:$.ajax 不会触发未经授权的回调(401)

    我正在使用 PhoneGap 构建 Android 应用程序 使用 jQuery 或 Zepto 我可以使用 ajax 调用来调用网站 API 然而 当网站返回 401 未经授权 响应时 ajax 调用似乎没有回调 没有调用 成功 错误 或
  • 在 Angular 的 Bower 组件中包含 html 模板

    我正在为我的角度应用程序制作一些可重用的指令 方法是将它们放入单独的 Bower 组件中 我想使用 templateUrl 作为指令 这样我就不会被迫执行本文中的三个选项之一 如何在我的 Angular 指令 Bower 包中使用单独的模板
  • SQL Server 条件 JOIN 语句

    是否可以执行以下操作 IF a 1234 THEN JOIN ON TableA ELSE JOIN ON TableB 如果是这样 正确的语法是什么 我认为您所要求的通过加入Initial两个表Option A and Option B
  • 如何准确读取一行?

    我有一个 Linux 文件描述符 来自套接字 我想读取一行 如何在 C 中做到这一点 如果您正在从 TCP 套接字读取数据 您无法假设何时到达行尾 因此你需要这样的东西 std string line char buf 1024 int n
  • 如何以编程方式向 iOS 地址簿添加“自定义标签”?

    在 iOS 地址簿中手动添加联系人的电话 IMS 时 您可以添加自定义标签 而不是 家庭 工作 其他 在 IMS 中 如何以编程方式在AddressBook中创建 自定义标签 我也有同样的问题 我找不到答案 所以我只是尝试猜测和检查方法 以
  • 获取matlab中fit函数的函数句柄并分配fit参数

    我正在将自定义函数拟合到我的数据中 获得拟合后 我想获得类似拟合函数的函数句柄之类的东西 包括设置为拟合找到的参数的参数 我知道我可以得到模型 formula fit 我可以通过以下方式获取参数 coeffvalues fit 但有没有什么
  • 为每个文件调用 Inno Setup AfterInstall 函数

    我想在安装文件夹后调用一个函数 但是InstallEnv函数似乎被调用了几次 也许每个文件都是文件夹 待确认 有没有办法在安装所有这些文件后只调用一次 我无法使用Run部分 因为我想用返回代码进行错误捕获 Source InputFiles
  • 使用 useRef 响应滚动导航

    我正在尝试制作一个单页应用程序 您单击链接 它会向下滚动到与菜单项对应的部分 我花了几天时间研究适合我标准的修复方案 不幸的是 我运气不佳 我的标准如下 无外部依赖 地址栏中必须包含 URL 以允许直接链接到特定部分 不能是 hacky 即
  • 关于默认捕获模式和 C++ lambda 表达式中的“this”的限制

    我想知道为什么 捕获默认值模式禁止this in 捕获列表 of C 拉姆达表达式 That is this error this OK 这是由 C 11 5 1 2 8 指定的 如果 lambda capture 包含捕获默认值 则 la
  • Firebase Functions 1.0.0 迁移:使用 Google 服务帐户凭据自定义initializeApp() 时出现问题

    我刚刚从 beta v0 9 1 更新到 v1 0 0 并遇到了一些初始化问题 根据迁移指南 https firebase google com docs functions beta v1 diff new initialization
  • 操作栏徽标左内边距

    操作栏在徽标左侧显示一个空格 我认为这个空间是为upindicator保留的 例如 我想给这个空间指定 20dp 的距离 我怎样才能做到这一点 我可以将图标的内边距设置为 0 但这不会消除徽标和屏幕左侧之间的空间 我尝试通过使用自定义布局来
  • SQL Server Express 2017 安装失败 [0x851A001A]

    安装 SQL Server 已经让我痛苦了好几个小时了 我无法得到任何工作 我设置了一个全新安装的 Windows Server 2016 虚拟机 并尝试安装 SQL Server Express 我按照建议将用户设置为网络服务here h
  • 为什么在未提供祖先的情况下查询不返回结果?

    为什么在未指定祖先时过滤器不起作用 无论祖先如何 它是否都应该适用于实体类型 我的用例 我已经设置了多个带有父键的实体 该键与另一个实体 主实体 相对应 以便我可以通过祖先 主实体键 获取子级 然而问题似乎是我无法再查询实体属性 除非我指定
  • Lucene 通配符匹配在化学符号上失败(?)

    使用 Hibernate 搜索注释 大部分只是 Field index Index TOKENIZED 我已经索引了一些与我的名为 Compound 的持久类相关的字段 我已经使用以下命令对所有索引字段设置了文本搜索MultiFieldQu
  • 当公式重新计算中仅特定 Excel 单元格发生更改时调用函数

    据我所知 Worksheet Calculate当工作表中任何单元格的值因公式重新计算而发生更改时调用 有没有办法让我只需要在公式重新计算中特定单元格发生更改时调用函数 要在更改特定单元格时发生某些事情 您需要在文件中嵌入相关的选择更改事件
  • 如何在 PowerShell 中正确/全局地对 UTF-8(无 BOM)文件进行分类? (到另一个文件)

    创建文件utf8 txt 确保编码为 UTF 8 无 BOM 将其内容设置为 In cmd exe type utf8 txt gt out txt 内容out txt is 在 PowerShell v4 中 cat utf8 txt g
  • 是否可以在 SAFEARRAY 中编组 ref 参数

    这是我的 C 服务器方法 public void Exec out int status string output status 3 Console WriteLine Exec 0 status output string Format