【发布时间】:2014-07-14 23:33:21
【问题描述】:
我正在制作一个部分用 C++ 和 C# 编写的程序。 C#主要用于GUI。 在我的 C++ 代码中,我创建 PowerPoint COM 对象并在其中打开一个演示文稿。
有时我需要在我的 C# 代码中引用 PowerPoint::_PresentationPtr。调用方法等等。
PowerPoint::_PresentationPtr 是用
_COM_SMARTPTR_TYPEDEF(_Presentation, __uuidof(_Presentation));
它是由 Visual Studio 在 msppt.tlh Microsoft.Office.Interop.PowerPoint.dll 绑定中定义的:
struct __declspec(uuid("91493463-5a91-11cf-8700-00aa0060263b"))
/* interface */ PresEvents;
struct /* coclass */ Presentation;
struct __declspec(uuid("9149349d-5a91-11cf-8700-00aa0060263b"))
/* dual interface */ _Presentation;
/* PowerPoint::_PresentationPtr */
_COM_SMARTPTR_TYPEDEF(_Presentation, __uuidof(_Presentation));
所以它使PowerPoint::_PresentationPtr便于在C++中使用COM对象,调用方法等。
这是 C# Microsoft.Office.Interop.PowerPoint.Presentation
namespace Microsoft.Office.Interop.PowerPoint
{
[CoClass(typeof(PresentationClass))]
[Guid("9149349D-5A91-11CF-8700-00AA0060263B")]
public interface Presentation : _Presentation, PresEvents_Event
{
}
}
我有一个带有 C++ 实现的 C# 接口,因此我可以在应用程序的 C# 部分访问它。
ApplicationHost.cs
namespace SampleWpfUserControlLibrary
{
public interface IApplicationHostWindow
{
void OpenDocument();
PowerPoint.Presentation GetPresentation();
void Exit();
}
}
ApplicationHost.h
#pragma once
#using <SampleWpfUserControlLibrary.dll>
using namespace SampleWpfUserControlLibrary;
ref class ApplicationHostWrapper : IApplicationHostWindow
{
public:
ApplicationHostWrapper(CMainFrame * pMainFrame)
{
_pMainFrame = pMainFrame;
}
virtual void __clrcall Exit() sealed
{
_pMainFrame->SendMessage(WM_CLOSE);
}
virtual void __clrcall OpenDocument() sealed
{
_pMainFrame->OpenDocument();
}
virtual PowerPoint::_PresentationPtr __clrcall GetPresentation() sealed
{
CMFCBindDoc * pDoc = _pMainFrame->GetDocView()->GetDocument();
return pDoc->GetPresentation();
}
};
但是它不能编译。争论 GetPresentation() 没有实现。
由于类型不匹配。
更新:
我应该在 C++ 代码 PowerPoint::_Presentation 或 PowerPoint::_PresentationPtr 中返回什么,我应该在 C# 部分将它映射到什么?或者如何在 C# 中将其转换为 Microsoft.Office.Interop.PowerPoint?我只想在 C# 中引用它。
这些是我得到的错误:**
- 错误 3 错误 C2259:“ApplicationHostWrapper”:无法实例化抽象类
Source\Application\MainFrm.cpp 146 1 个应用程序- 错误 1 错误 C3766:“ApplicationHostWrapper”必须提供接口方法的实现
'Microsoft::Office::Interop::PowerPoint::Presentation
^SampleWpfUserControlLibrary::IApplicationHostWindow::getPresentation(void)' source\application\ApplicationHostWrapper.h 39 1 应用程序
在对象浏览器中的 getPresentation() 方法是这样的:
未知类型^ getPresentation() SampleWpfUserControlLibrary::IApplicationHostWindow 的成员
【问题讨论】:
-
IApplicationHostWindow的定义是什么? -
为了提供托管和非托管代码之间的通信,我需要保持对象之间的引用。当用户单击 Open 菜单项时,该事件在 C# 代码中处理,但必须执行非托管代码才能打开演示文件并将其嵌套到视图中。它用作应用程序的托管层和非托管层之间的桥梁。它是 C++/CLI 包装器
-
随便。接口的确切定义和编译器所说的很重要。
-
我更新了帖子,添加了错误。你的定义是什么意思?这一切都在帖子中。
-
C++ COM 智能指针可以在这里代替 .NET RCW 吗?如果
ApplicationHostWrapper在非托管 C++ 中作为 COM 类实现,则返回该智能指针是正确的,但我不确定在实现 .NET 对象时是否在 C++/CLI 中执行此操作。此外,看起来Presentation和_Presentation与您发布的 C# sn-p 的接口不同。
标签: c# c++ com office-interop smart-pointers