将 ArgIterator 编组到 va_list

2024-05-06

所以,我想到了尝试 p/invoke C 函数va_list。我知道如何 p/调用经典的可变参数函数(使用__arglist),在我看来va_list就像一个ArgIterator,我认为可以将其传递给该方法:

[DllImport("msvcrt.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int vswprintf(StringBuilder str, int length, string format, ArgIterator args);

public static int vswprintf(StringBuilder str, int length, string format, __arglist)
{
    return vswprintf(str, length, format, new ArgIterator(__arglist));
}

int len = 100;
StringBuilder sb = new StringBuilder(len);
vswprintf(sb, len, "%s, %d", __arglist("test", 2));

事实证明.NET确实认识到了这一点,因为抛出了以下异常:

System.NotSupportedException
   in System.StubHelpers.StubHelpers.MarshalToUnmanagedVaListInternal(IntPtr va_list, UInt32 vaListSize, IntPtr pArgIterator)
   in Program.vswprintf(StringBuilder str, Int32 length, String format, ArgIterator args)
   in Program.vswprintf(StringBuilder str, Int32 length, String format)

所以,显然,.NET 知道我正在尝试做什么,并且有一些应该做到的事情:

[MethodImpl(MethodImplOptions.InternalCall), ForceTokenStabilization]
internal static extern void MarshalToUnmanagedVaListInternal(IntPtr va_list, uint vaListSize, IntPtr pArgIterator); //Reflector

参数的名称暗示了目的,但例外让我感到困惑。我是否执行了 p/invoke 错误,或者这个 .NET 编组方法尚未完成?

Edit:
经过一番研究后,我发现执行 https://github.com/dotnet/coreclr/blob/master/src/vm/clrvarargs.cpp#L42这个方法似乎不可能传递一个普通的字符串。所以我修改了代码:

vswprintf(sb, len, "%d, %d", __arglist(1, 2));

但这引发了AccessViolationException(我最喜欢的)!现在怎么了?


None

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

将 ArgIterator 编组到 va_list 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点

随机推荐

  • 如何在 Haskell 中获得列表的中间位置?

    我刚刚开始使用 Haskel 学习函数式编程 我正在慢慢度过Erik Meijer 在 Channel 9 的讲座 http channel9 msdn com shows Going Deep Lecture Series Erik Me
  • 类模板的嵌套模板参数推导不起作用

    In 本次问答 https stackoverflow com a 42221591 819272我编写了一个小包装类 它提供对范围的反向迭代器访问 依赖于类模板的 c 1z 语言功能模板参数推导 p0091r3 http www open
  • 在Android上显示简单的位图

    图形初学者在这里 我试图在我的设备上显示一个简单的图像 但没有出现任何内容 并且日志 没有显示任何错误 程序运行但没有任何反应 这是我的代码 protected void onDraw Canvas canvas canvas drawBi
  • 未捕获的类型错误:$.ajax 不是函数

    我正在制作一个带有排行榜表的小型游戏项目 我正在尝试使用 jQuery ajax 和 PHP 从 mysql 数据库获取排行榜以显示 但它给了我一条错误消息 我的语法看起来不错 所以我不确定问题是什么 leader btn click fu
  • 使用 Webpack 进行缓存,索引源代码中的 [hash] 值,使用 React.js

    我正在构建一个同构应用程序 它完全是用react构建的 也就是说 html基础也在react中 我有我的根 html 作为应用程序组件 它看起来像这样 var AppTemplate React createClass displayNam
  • d3 同步 2 个独立的缩放行为

    我有以下 d3 d3fc 图表 https codepen io parliament718 pen BaNQPXx https codepen io parliament718 pen BaNQPXx 该图表的主要区域有缩放行为 y 轴有
  • Google 服务帐户用户界面

    我怎样才能登录谷歌服务帐户 https developers google com identity protocols OAuth2ServiceAccount使用普通的网络用户界面 例如谷歌驱动器 https www google co
  • 无法解析:com.google.android.gms:play-services:15.0.1

    在同步 gradle 时出现以下错误 我检查了与类似问题相关的其他答案并遵循了他们的答案 但仍然出现相同的错误 无法解析 com google android gms play services 15 0 1 安装存储库并同步项目 在文件中
  • 在 Unix 中,我可以在目录中运行“make”而无需先 cd 到该目录吗?

    在 Unix 中 我可以运行make在没有的目录中cd首先进入该目录 make C path to dir
  • Java 日历一天中的小时返回 12 小时格式

    在 Java 文档中 Calendar HOUR应该以 12 小时格式返回小时 并且Calendar HOUR OF DAY应该以 24 小时格式返回小时 但两者都以 12 小时格式返回 My Code Calendar rightNow
  • ActiveMQ 的 @SendTo 注释无提示地失败

    我试图使用 SendTo 注释将 JMS 消息推送到 SpringBoot 应用程序中的独立 ActiveMQ 代理 但是执行完成时没有错误 异常 但消息未排队 相反 如果我使用 JmsTemplate 在代码中注释 消息将排队 使用 Se
  • 什么是接口标识符

    我有一台笔记本电脑 使用一个或多个网络适配器连接到我组织的网络 我正在尝试编写一个工具来持续监控每个网络的连接状态和连接质量 然而 我的网络知识有限 术语让我感到困惑 特别是查找所有网络适配器 有人建议我使用命令ifconfig它给了我所谓
  • Next.js 使用 SSR 的本地存储问题

    我有以下自定义挂钩 它将数据存储在本地存储中 import useCallback useEffect useState from react export const useLocalStorage key initialValue gt
  • 如何用不动点进行多项式拟合

    我一直在使用 numpy 使用最小二乘法 在 python 中进行一些拟合 我想知道是否有一种方法可以让它适应数据 同时强制它通过一些固定点 如果没有 python 中是否有另一个库 或我可以链接到的另一种语言 例如 c NOTE我知道可以
  • 使用 Excel VBA 在 Outlook 电子邮件中使用 HTML 设置背景图像

    我正在尝试使用 Excel VBA 创建一封有关澳大利亚儿童癌症研究所的电子邮件 并带有背景图像 CCIALittleGirl jpg 然后 我希望在其上方有一个文本或文本框 最好是带有白色粗体文本 我可以在运行时填充这些文本 我可以在电子
  • 如何跟踪访客从哪里来到我的网站 php

    我想跟踪用户访问我的网站的网站 URL 他来自 i el Google GMail Facebook 等 I tried SERVER HTTP REFERER 但当用户从任何外部站点单击我的站点链接时 它不包含任何内容 但当我访问我的站点
  • 在散景图中隐藏图例

    LS 散景图会自动生成图例 如何隐藏 根本不显示 散景图中的图例 我试过 legend none 但没有成功 谢谢 如果我能稍微扩展一下 legend False是使散景图例不可见的正确方法 但它在绘图本身的创建中使用 而不是作为绘图对象的
  • Hibernate版本的jars,maven,应该放在一起吗?

    我很难理解哪些 jar 版本应该与 hibernate 一起使用 我有一组可以一起工作的 hibernate 版本 Maven 东西 但我不知道为什么 我怎样才能知道哪些版本与其他版本一起工作 我也想升级我的休眠 但我不知道要放入什么版本号
  • 将字符串拆分为单词和标点符号,而不使用任何导入

    我见过与我的问题类似的问题 但它们都使用了正则表达式 我想做的是接受诸如 哇 这真的很有帮助 之类的输入 然后返回到 哇 这真的很有帮助 所以我想将标点符号从单词中分离出来 我已经尝试过这个 但它根本不起作用 sentence input
  • 将 ArgIterator 编组到 va_list

    所以 我想到了尝试 p invoke C 函数va list 我知道如何 p 调用经典的可变参数函数 使用 arglist 在我看来va list就像一个ArgIterator 我认为可以将其传递给该方法 DllImport msvcrt