问题标签 [managed-c++]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3457 浏览

interface - 托管 C++ 中的接口类

托管 C++ 中的接口对我来说有点奇怪,因为它们允许在其中使用静态方法和成员。例如,以下是一个有效的 MC++ 接口。

好吧,我的问题是接口中静态方法的用途是什么。以及虚拟表等发生了什么。实现此接口的类的虚拟表将是什么。有很多问题浮现在脑海。这种类型的类,即接口类不等同于普通的抽象类,因为我们不能在这里定义非静态方法。

我只想知道在界面中允许静态的智慧。这肯定违反了 IMO 的 OOP 原则。

0 投票
2 回答
5247 浏览

managed - 尝试使用托管 C++ 包装本机 C++ 类时,我得到 LNK2028

尝试使用托管 c++ 类包装本机 cpp 类。

一切看起来都不错,但由于某种原因它不会编译。

得到以下链接器错误:

错误 25 错误 LNK2028:未解析的令牌 (0A0002CE) 错误 27 错误 LNK2019:未解析的外部符号

任何想法如何解决这个问题?:\

好吧,这是其中一个功能的完整错误:

错误 20 错误 LNK2028:未解析的令牌 (0A0002CF) “public: bool __thiscall RCSclient::ResumeChannel(char *,int,__int64)” (?ResumeChannel@RCSclient@@$$FQAE_NPADH_J@Z) 在函数“public: bool __clrcall RCSClientWrapper”中引用::RCSclientWrapper::ResumeChannel(class System::String ^,int,class System::DateTime ^)" (?ResumeChannel@RCSclientWrapper@RCSClientWrapper@@$$FQ$AAM_NP$AAVString@System@@HP$AAVDateTime@4@ @Z) RCSClientWrapper.obj RCSClientWrapper

试图添加 user32.lib 没有结果..

提供

0 投票
4 回答
1095 浏览

c++ - 帮助对混合模式 Win32 应用程序进行事后调试

情况如下:

背景

我有一个在 Visual Studio 2008 中开发的混合模式 .NET/Native 应用程序。

我所说的混合模式是指前端是用 C++ .NET 编写的,它调用本机 C++ 库。本机代码在应用程序中完成大部分工作,包括根据需要启动新线程。.NET 代码仅用于 UI 目的(赢取表单)。

我有一个在测试人员的计算机上运行的应用程序的发布版本。

本机库经过全面优化编译,但也启用了调试(“调试信息格式”设置为“程序数据库”)。

这意味着我在 PDB 文件中有应用程序的调试符号。

问题

所以无论如何,其中一位测试人员遇到了应用程序问题,它偶尔会在 XP 上崩溃。我已经能够使用 Watson 博士多次运行获得崩溃的小型转储。

当我调试它时(使用 minidump - 我实际上并没有调试真正的应用程序),所有调试符号都正确加载:我可以正确看到所有本机线程的完整堆栈跟踪。其他线程(可能是 .NET 线程)没有堆栈跟踪,但它们至少都向我显示了线程是在哪个 dll 上启动的(即 ntdll.dll)。

它正确报告失败的线程(“用户(5).dmp 中 0x0563d652 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000)。

但是,当我进入线程时,它显示没有任何用处。在堆栈跟踪中有一个条目,它只有内存地址“0563d652()”(甚至不是“ntldll.dll”)。

当我进行拆卸时,它只显示大约 30 条指令的随机部分。内存地址的任何一侧都只是“???”。它几乎看起来不是我的源代码的一部分(您的二进制文件不是按顺序加载到内存中吗?在中间有一组随机的汇编语句是否正常?)。

我的问题

所以基本上我的问题是三次的。

1)任何人都可以解释调试器缺乏信息吗?

2)请记住,我无法显示我的代码中发生的错误,任何人都可以提出失败的原因

3) 我可以做任何其他事情来帮助我在未来诊断当前的问题吗?

帮助!

约翰

更新:

这是来自 WinDBG 的失败线程的堆栈转储

很奇怪吧?甚至不显示 DLL。

是否有可能我已经以某种方式破坏了堆栈/堆,导致线程刚刚被破坏......?

0 投票
1 回答
808 浏览

.net - Windows 窗体控件库;托管和非托管

我编写的 Windows 窗体控件库项目 (C++) 使用非托管 dll。非托管 dll 有一个头文件(柴郡猫)。我只是将它包含在控制库项目中。并调用非托管 dll 中的函数(当然需要适当的编组)。这将编译和构建。问题是当我继续将控件添加到我的脚手架的工具箱中时,这是一个托管 C++ winform 应用程序,VS2005 抱怨它不是一个 .Net 模块。

我见过人们使用 MFC dll 作为 Windows 窗体控件进行转换。我究竟做错了什么?。

0 投票
2 回答
1955 浏览

c++ - 将 Windows 句柄传递给非托管 C++ dll

非托管 C++ dll 有一个导出函数,它采用 int 类型作为窗口句柄

否则,在非托管 dll 代码中,它int被强制转换为HWND并正确使用。

从 windows 窗体应用程序中,我将句柄设置如下

_hHandle类中的私有成员在哪里。我的手柄正确吗?似乎是这样,但显然应用程序没有给出期望的输出。我怀疑问题出在手柄上。

PS:我可以访问非托管 dll,因此我可以在其中进行修改以进行任何建议的更改。

0 投票
2 回答
8331 浏览

c# - 如何在没有大内存分配的情况下显示快速更新的图像?

我在超声波机器上有一个 WPF 应用程序,它以每秒 30 帧以上的速度显示用 C++ 生成的超声波图像。

据我了解,在 WPF 中显示图像的正常过程是为您的图像创建一个 BitmapSource 并为您的图像设置 Source,然后使其无效并显示。

由于 BitmapSources 没有实现 IDisposable,使用这种方法迫使我每秒创建 30 个 BitmapSources。对于具有 32bppArgb 格式的 640x480 图像,这大约是每秒分配 30MB 的内存,然后每 10 秒处理一次垃圾,从而导致明显的延迟。显然不是一个可接受的解决方案。

我目前的解决方案是:

在 C++ 中:我在托管 C++ 中创建 System.Drawing.Bitmap(WinForms 位图),从指针执行 memcpy 以填充图片,使用 Graphics 对象进行一些我需要的额外绘图,并将其传递到 C#/WPF在 ImageReceived 事件期间。

在 C# Image.Source 中设置为由 BitmapBuffer 生成的源,这是一种访问位图源的原始数据的黑客方式:请参阅此链接。我执行 CopyMemory 的 P/Invoke 以将 Bitmap.Scan0 中的数据复制到 BitmapBuffer 中。然后我使 Image 无效以更新屏幕,并 Dispose() Drawing.Bitmap 对象以释放内存。

虽然这种方法已经奏效了一段时间,但它看起来很老套,我很难相信除了通过反射之外没有其他“合适的”方法可以做到这一点。

问:有没有更好的方法?

0 投票
1 回答
659 浏览

.net - C++/CLI 终结器和运算符

在以下示例中,我得到:

如果我删除 operator->,这个错误就会消失。有人可以解释为什么会这样吗?

0 投票
2 回答
18771 浏览

.net - 托管 C++ 中的数组初始化

我希望声明和初始化一维托管项目数组。

如果是 C# 代码,我会这样写:

我正在尝试在托管 C++ 中编写(好吧,实际上,我正在编写程序生成)相同的东西......

到目前为止,我有:

这有两个问题:

  1. 它更冗长
  2. 它需要我预先声明数组的大小,这对我的代码生成器来说很不方便

托管 C++ 中的 GC 数组是否有“数组初始化”语法?什么是正确的语法?这个问题和其他类似问题是否有很好的网络链接?

0 投票
1 回答
348 浏览

.net - 托管 C++ 中的数组初始化错误(后续)

跟进我之前的问题。

谁能解释为什么以下代码编译没有任何错误:

然而这给了我“错误C2440:'初始化':无法从'VdbParameterInfo ^'转换为'VdbMethodInfo ^”

我所做的只是尝试将参数数组“嵌套”在方法数组初始化中......不直接介意 - VdbMethodInfo 的构造函数将 ParameterArray 作为第二个参数。

这似乎暗示托管 C++ 数组初始化期望任何递归嵌套具有相同的类型......(即我认为这一定是一个错误)

相关问题:这里

0 投票
4 回答
2190 浏览

.net - 误报:SqlCommand、SqlParameter 和单引号

我正在尝试修复代码中的单引号错误:

错误是如果 idx="that's",SQL 会失败,说明存在语法错误。显然,问题出在报价单上。但是一些谷歌搜索表明使用参数是使用引号的方法。如果类型是 TEXT 而不是 VARCHAR,则 SqlParameter 运行良好。

除了手动将字符串中的引号符号数量加倍之外,还有其他解决方案吗?

更新:我尝试在 SQL Management Studio 中手动编辑此字段,但它不允许在 VARCHAR 字段中使用单引号。这在 SQL 中正常吗?