Visual Studio 2010 SDK打开特定于项目的编辑器

时间:2011-03-20 14:13:05

标签: c# visual-studio-sdk

我正在尝试使用此处描述的步骤在我的VSProject中打开一个新文档(我正在创建的文档):

但是我没有取得多大成功 - 上面的链接告诉我我应该调用IVsUIShell.CreateDocumentWindow但是我得到-2147024809FFFFFFFF80070057)的返回值和输出{ {1}}为空。

我做错了什么?有没有关于如何使用此方法创建新文档窗口的示例?

这是我到目前为止所做的:

ppWindowFrame

int retval = rdt.FindAndLockDocument( (uint)_VSRDTFLAGS.RDT_EditLock, // dwRDTLockType myDocumentUniqueIdentifier, // pszMkDocument out hierachy, // ppHier out itemId, // pitemid out docData, // ppunkDocData out cookie); // pdwCookie IVsWindowFrame windowFrame; Guid emptyGuid = Guid.Empty; Guid editorType = new Guid(GuidList.VSPackageEditorFactoryString); // I know that the document is not open retval = shell.CreateDocumentWindow( 0, // grfCDW myDocumentUniqueIdentifier, // pszMkDocument (IVsUIHierarchy)hierachy, // pUIH itemId, // itemid IntPtr.Zero, // punkDocView docData, // punkDocData ref editorType, // rguidEditorType "MyPhysicalView", // pszPhysicalView ref emptyGuid, // rguidCmdUI this, // psp "New document", // pszOwnerCaption "New document", // pszEditorCaption null, // pfDefaultPosition out windowFrame); // ppWindowFrame 的返回值为FindAndLockDocument1),我认为这意味着找不到该文档。 S_FALSEitemId,这绝对是一个坏兆头 - 我是否需要在调用uint.MaxValue之前以某种方式在正在运行的文档表中创建一个条目?如果是这样,我该怎么做?

任何覆盖地上的例子或样本都会非常有用。

1 个答案:

答案 0 :(得分:1)

我终于在MSDN论坛上的这个帖子的帮助下管理了这个:

我的代码现在使用IVsUIShellOpenDocument界面和OpenDocumentViaProjectWithSpecific方法 - 以下代码段是基本的但实际上有效:

IVsUIShellOpenDocument shellOpenDocument = (IVsUIShellOpenDocument)GetService(typeof(IVsUIShellOpenDocument));

string mkDocument = "MyUniqueDocumentId";

// This is the GUID for the editor factory, i.e. the one that appears in the Guid attribute on your
// editor factory (that implements IVsEditorFactory): [Guid(GuidList.guid_VSPackageEditorFactory)]
Guid xmlGuid = GuidList.guid_VSPackageEditorFactory;

string physicalView = null;
Guid logicalViewGuid = VSConstants.LOGVIEWID_Primary;
Microsoft.VisualStudio.OLE.Interop.IServiceProvider ppSP;
IVsUIHierarchy ppHier;
uint pitemid;
IVsWindowFrame ppWindowFrame;

shellOpenDocument.OpenDocumentViaProjectWithSpecific(
    mkDocument,
    (uint)__VSSPECIFICEDITORFLAGS.VSSPECIFICEDITOR_DoOpen,
    ref xmlGuid,
    physicalView, 
    ref logicalViewGuid, 
    out ppSP, 
    out ppHier, 
    out pitemid, 
    out ppWindowFrame);

if (ppWindowFrame != null)
{
    ppWindowFrame.Show();
}