首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在C#中使用C++组件对象模型

在C#中使用C++组件对象模型
EN

Stack Overflow用户
提问于 2012-09-03 13:38:47
回答 2查看 1.5K关注 0票数 5

我正在尝试使用C#项目在C++中构建一个COM库来进行测试。有些方法需要向调用者返回字符串。在从C#调用这些方法时,我得到了这样的结果:“在位置读取访问冲突...”

这是我的测试项目中的C++代码(不包括VS2010ATL生成的所有内容)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//COMTest.idl
[id(1)] HRESULT Test([out,retval] BSTR* ret);

//Program2.h
STDMETHOD(Test)(BSTR* ret);

//Program2.cpp
STDMETHODIMP CProgram2::Test(BSTR* ret)
{
   BSTR tmp = (BSTR)CoTaskMemAlloc(sizeof(wchar_t) * 2);
   tmp[0] = L'H';
   tmp[1] = L'\0';

   *ret = (BSTR)tmp;
   return S_OK;
}

在C#中,我只是从COM-Tab中引用了DLL,关闭了"Embed Interop Types“,因为它会导致错误,并运行以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static void Main(string[] args)
{
   COMTestLib.Program2Class instance = new COMTestLib.Program2Class();
   string tmp = instance.Test(); //Where the error occurs

   Console.WriteLine(tmp); //This is not reached

   Console.Read();
}

离开Test-Method后出现错误。我从我的C#项目中调试了C++代码,值被放在了正确的位置。如果我尝试返回0(在C#中为null ),即使我仍然像示例中那样分配内存,也不会得到错误。

我无法理解访问冲突所抱怨的地址。它既不是我正在分配的地址,也不是该方法中使用的任何其他地址。我还觉得奇怪的是,CoTaskMemAlloc-Function总是返回第一个字节设置为0 (0x00XXXXXX)的地址,但这可能只是COM的问题。

我的想法用完了,我在任何地方都找不到太多关于这方面的信息(除了基本的COM教程)。有人能帮上忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-03 19:54:31

BSTR需要额外的内存(以跟踪字符串len),因此必须使用SysAllocString()函数来分配BSTR(或者使用一个“智能”BSTR类)。

所以你的原始代码应该是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Program2.cpp
STDMETHODIMP CProgram2::Test(BSTR* ret)
{
   *ret = SysAllocString(L"H");
   return S_OK;
}

关于BSTR的一本好书:http://blogs.msdn.com/b/ericlippert/archive/2003/09/12/52976.aspx

票数 4
EN

Stack Overflow用户

发布于 2012-09-03 14:09:21

检查您的COM项目和测试项目是否都是STA。也检查一下bitness。如果用LPSTR替换BSTR会怎么样?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12249007

复制
相关文章
C++|对象模型|对象模型综述
作为C++的核心单元,对象模型在编译器眼中是如何实现的?本文从几个基本理论模型出发,剖析实际。
朝闻君
2021/11/22
6850
C++|对象模型|对象模型综述
C++对象模型-关于对象
从这篇博客开始真正介绍C++对象模型,前边BB了那么多没用的,终于开始了C++对模型的分析。关于C++对象模型的介绍,我将根据《深度探索C++对象模型》这本书,其书中的每一章,对应一篇博客,博客内容为自己对这本书的理解和补充吧。
chinchao.xyz
2022/04/25
4420
C++对象模型-关于对象
C++对象模型-引用
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)
chinchao.xyz
2022/04/25
6140
c++之对象模型
每个空对象占用的内存空间为:1。c++编译器会给每个空对象也分配一个内存空间,是为了区分空对象占内存的位置。每个空对象应该有一个独一无二的空间。
西西嘛呦
2020/08/26
3150
探索C++对象模型
只说C++对象模型在内存中如何分配这是不现实的,所以这里选择VS 2013作为调试环境具体探讨object在内存中分配情况.目录给出了具体要探讨的所有模型,正文分标题依次讨论.水平有限,如有错误之处请多包涵如若能及时反馈于我请接受我的谢意.
racaljk
2018/08/31
5360
C++对象模型-ObjectSliced
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)
chinchao.xyz
2022/04/25
3700
C++对象模型-ObjectSliced
C#中的深复制和浅复制(在C#中克隆对象)
C# 支持两种类型:“值类型”和“引用类型”。  值类型(Value Type)(如 char、int 和 float)、枚举类型和结构类型。  引用类型(Reference Type) 包括类 (Class) 类型、接口类型、委托类型和数组类型。
立羽
2023/08/24
8110
C++中fstream_在使用中
C++中处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。作为派生的类,它们继承了插入和提取运算符(以及其他成员函数),还有与文件一起使用的成员和构造函数。可将文件<fstream> 包括进来以使用任何fstream。如果只执行输入,使用ifstream类;如果只执行输出,使用 ofstream类;如果要对流执行输入和输出,使用fstream类。可以将文件名称用作构造函数参数。
全栈程序员站长
2022/10/02
5.6K0
C++中fstream_在使用中
C++学习笔记-对象模型,this
下面是我自己写的一段代码:A类代表Shape,B类代表quadshape,C类代表equalShape:
买唯送忧
2021/04/30
2310
C++对象模型-Default Constructor
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)
chinchao.xyz
2022/04/25
6450
C++对象模型-virtual继承
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)
chinchao.xyz
2022/04/25
4460
com组件与dll的区别_组件对象模型
com英文为Component Object Model(组件对象模型),是微软生产软件组件的标准。
全栈程序员站长
2022/11/01
1.4K0
图说C++对象模型:对象内存布局详解
0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。 本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可能
Tencent JCoder
2018/07/02
4.3K0
在C#使用文件监控对象FileSystemWatcher 实现数据同步
       最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容。首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给WEB服务器做别的操作,而那个文本的写入有时候会频繁,1秒可能多次,但是也有可能在相当长一段时间内是没有任何写入的。 这样一来如果每秒都去访问文件的话,一个是IO问题,还有就是每次操作都会引起后端一系列程序的反应,文本在长时间内无写入的话,一秒一次的触发一系列徒劳的事情太不可取了。 最终发现了c#中的F
hbbliyong
2018/03/06
2.7K0
Gatsby中怎么在组件中使用css?
gatsby 为自动修改样式组件中的className,使其具有唯一性,避免与其他名称冲突而失效。
Learn-anything.cn
2021/12/03
3.4K0
在 Vue 中,使用 $attrs 构建高级组件
这节课,我们来看下 Vue3 中的 $attrs 属性。首先,我们会介绍它的用途以及它的实现与 Vue2 有哪些不两同点,并通过事例来加深对它的理解。
前端小智@大迁世界
2022/10/27
2.5K0
在 Vue 中,使用 $attrs 构建高级组件
C++对象模型和this指针详解
这篇文章主要介绍了详解C++对象模型和this指针,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助
米米素材网
2022/07/24
2410
C++对象模型和this指针详解
C++|对象模型|合成构造函数
当我看到书中作者的这句话时,几乎是一身冷汗。老实说,我个人对于合成构造函数的理解的确是无则加,有则否。但是Stanley却直接指出了新手常有的这一误解。
朝闻君
2021/11/22
5760
C++|对象模型|“虚构造函数“
析构函数必须为虚,构造函数不能为虚,因为在对象完全构造之前是没有类型的,也不存在虚表,所以虚构造函数也就不可能发生。这应该是常识,面试中问到也会不假思索回答。
朝闻君
2021/11/22
3940
C++ 中的函数对象(仿函数)的使用
函数对象,即一个重载了括号操作符“()”的对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。即重载函数调用操作符的类,其对象通常称为函数对象。函数对象使用重载()时,行为类似函数调用,因此也叫仿函数。
耕耘实录
2022/05/09
2K0

相似问题

C++组件对象模型

12

使用模型在组件中创建对象

10

从嵌套对象中的父组件访问C++模型

20

C#在模型中嵌套对象而不使用视图模型

27

帮助理解使用C#的组件对象模型的书籍/资源?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文