我正在尝试使用此处描述的步骤在我的VSProject中打开一个新文档(我正在创建的文档):
但是我没有取得多大成功 - 上面的链接告诉我我应该调用IVsUIShell.CreateDocumentWindow但是我得到-2147024809
(FFFFFFFF80070057
)的返回值和输出{ {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
的返回值为FindAndLockDocument
(1
),我认为这意味着找不到该文档。 S_FALSE
是itemId
,这绝对是一个坏兆头 - 我是否需要在调用uint.MaxValue
之前以某种方式在正在运行的文档表中创建一个条目?如果是这样,我该怎么做?
任何覆盖地上的例子或样本都会非常有用。
答案 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();
}