我正在尝试ISearchManager2在 C# 上加载界面。
直到这一刻,一切正常ISearchManager。我使用 Microsoft.Search.Interop 程序集来做到这一点。我可以设置目录,从索引器和其他东西中获取一些结果。
但是,现在,我想要一个名为的接口ISearchManager2,所以,我创建了:
[ComConversionLoss]
[ComImport]
[Guid("DBAB3F73-DB19-4A79-BFC0-A61A93886DDF")]
[InterfaceType(1)]
public interface ISearchManager2 : ISearchManager
{
void CreateCatalog([MarshalAs(UnmanagedType.LPWStr)] [In] string pszCatalog, out ISearchCatalogManager _out);
void DeleteCatalog([MarshalAs(UnmanagedType.LPWStr)] string pszCatalog);
}
相同的签名和顺序searchapi.h是:
MIDL_INTERFACE("DBAB3F73-DB19-4A79-BFC0-A61A93886DDF")
ISearchManager2 : public ISearchManager
{
public:
virtual HRESULT STDMETHODCALLTYPE CreateCatalog(
/* [string][in] */ __RPC__in_string LPCWSTR pszCatalog,
/* [out] */ __RPC__deref_out_opt ISearchCatalogManager **ppCatalogManager) = 0;
virtual HRESULT STDMETHODCALLTYPE DeleteCatalog(
/* [string][in] */ __RPC__in_string LPCWSTR pszCatalog) = 0;
};
使用有效的ISearchManagerIm 铸造,例如:
ISearchCatalogManager _out;
Teste _test = (Teste)_searchManager;
_test.CreateCatalog(catalog, out _out);
QueryInterface 没有错误(这意味着找到了接口)并且没有异常(有 hresults)。但是,它从未分配过。调试它,我可以看到string catalog变化。
[
这是在通话之前CreateCatalog
。之后:
我假设它使用额外参数调用的 C# 和第二个(输出值)是字符串。我尝试过PreserveSigAttribute和其他类似的东西:
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void CreateCatalog([MarshalAs(UnmanagedType.LPWStr)] [In] string pszCatalog, out ISearchCatalogManager _out);
因为当我从(来自 Microsoft.Search.Interop)反编译接口时,我可以在具有相同签名的ISearchManager函数上看到该属性。GetCatalog
有人知道为什么会这样?
白衣染霜花
相关分类