首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++-CLI中创建全局句柄

如何在C++-CLI中创建全局句柄
EN

Stack Overflow用户
提问于 2009-02-24 13:16:09
回答 5查看 5.5K关注 0票数 0

我试图在一个C++-CLI项目中使用一个C#类,但是Visual Studio只允许我在一个局部作用域中声明一个C#对象的句柄(^),就在一个函数内部。我让它工作的唯一方法是声明一个指向句柄的全局指针:

代码语言:javascript
复制
SUTAdapter::Form1^ *ptForm1;

但如果我在函数内部创建了一个对象,并将其地址提供给全局指针:

代码语言:javascript
复制
SUTAdapter::Form1^ form1;
form1 = gcnew SUTAdapter::Form1();
ptForm1 = &form1;
(*ptForm1)->incCounter(0);

当函数退出时,当我尝试在其他C++-CLI函数中使用incCounter函数时,对象似乎消失了(调试器显示此==为空)。有没有办法在C++-CLI中拥有C#代码的全局句柄?我猜全局句柄是被禁止的,因为我不明白什么原因,但是我已经没有想法了,我需要完成这个任务。谢谢。

编辑:

代码语言:javascript
复制
*ptForm1 = gcnew SUTAdapter::Form1();

给出空引用异常。为什么?

EN

回答 5

Stack Overflow用户

发布于 2009-02-24 14:25:14

这一限制似乎与其他基于CLR的语言一致。例如,C#没有静态的、函数作用域变量的概念。C++/CLI中缺乏这样的功能表明这就是CLR的工作方式-静态对象必须在类作用域中定义。

CLR是基于对象,因此这只是面向对象性质影响在其上运行的语言设计的一个例子。

从面向对象的角度来看,我更喜欢C#的方式。

票数 4
EN

Stack Overflow用户

发布于 2009-02-24 13:52:31

Visual Studio是否允许您在本地范围内声明C#对象的静态句柄?

代码语言:javascript
复制
SUTAdapter::Form1^ theForm() {
   static SUTAdapter::Form1^ form1 = gcnew SUTAdapter::Form1();
   return form1;
}
票数 1
EN

Stack Overflow用户

发布于 2009-02-24 14:03:08

好的,谢谢你的回答,但我终于解决了,我发现它在谷歌上搜索:

http://bytes.com/groups/net-vc/473036-how-define-global-com-object-vc-8-a

似乎VS不允许在函数中使用全局句柄或静态句柄。我对此感到困惑,因为有时需要全局访问托管对象。

解决方案是声明一个内部带有静态句柄的"GlobalObjects“类:

代码语言:javascript
复制
ref class GlobalObjects
{
public:
static SUTAdapter::Form1^ hndForm1;
};

这样,我就可以全局访问C#窗体/类。之前错误的错误代码是C3145,我仍然想知道为什么VS不允许声明全局句柄。

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

https://stackoverflow.com/questions/581682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档