我正在尝试在C#应用中使用Microsoft的文本服务框架。到目前为止,它已经全部消失了,但我遇到了让我难过的东西。根据MSDN文档,ITfFnReconversion接口发布此方法:
HRESULT GetReconversion(
[in] ITfRange *pRange,
[out] ITfCandidateList **ppCandList
);
我在C#中宣称为:
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void GetReconversion([In, MarshalAs(UnmanagedType.Interface)] ITfRange pRange, [Out, MarshalAs(UnmanagedType.Interface)] out ITfCandidateList ppCandList);
我这样打电话:
ITfCandidateList candidateList;
reconversionInstance.GetReconversion(range, out candidateList);
reconversionInstance和range的值是先前设置的,我确信它们是有效的。 每次执行此行时,都会收到“访问冲突”错误,指示某些内容尝试读取或写入受保护的内存。我假设这是由于候选列表参数的不正确编组,但我对其他可能性持开放态度。
鉴于param被声明为指针的指针,我也尝试将其作为IntPtr传递,如下所示:
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void GetReconversion([In, MarshalAs(UnmanagedType.Interface)] ITfRange pRange, [Out, MarshalAs(UnmanagedType.SysInt)] out IntPtr ppCandList);
IntPtr candidateList;
reconversionInstance.GetReconversion(range, out candidateList);
但是留下了同样的错误。
如何正确编组,以便我可以获取ITfCandidateList的实例?
为了澄清,这里是我导入它们的接口,但正如我所提到的,我为GetReconversion尝试了几个不同的签名:
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("4CEA93C0-0A58-11D3-8DF0-00105A2799B5")]
public interface ITfFnReconversion : ITfFunction
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void GetDisplayName([Out, MarshalAs(UnmanagedType.BStr)] out string pbstrName);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void QueryRange([In, MarshalAs(UnmanagedType.Interface)] ITfRange pRange, [In, Out, MarshalAs(UnmanagedType.Interface)] ref ITfRange ppNewRange, [Out, MarshalAs(UnmanagedType.Bool)] out bool pfConvertable);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void GetReconversion([In, MarshalAs(UnmanagedType.Interface)] ref ITfRange pRange, [Out, MarshalAs(UnmanagedType.SysInt)] out IntPtr ppCandList);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void Reconvert([In, MarshalAs(UnmanagedType.Interface)] ITfRange pRange);
}
[ComImport, Guid("A3AD50FB-9BDB-49E3-A843-6C76520FBF5D"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITfCandidateList
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void EnumCandidates([Out, MarshalAs(UnmanagedType.Interface)] out IEnumTfCandidates ppEnum);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void GetCandidate([In] uint nIndex, [Out, MarshalAs(UnmanagedType.Interface)] out ITfCandidateString ppCand);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void GetCandidateNum([Out] out uint pnCnt);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void SetResult([In] uint nIndex, [In, ComAliasName("TSF.TfCandidateResult")] TfCandidateResult imcr);
}
答案 0 :(得分:0)
这里有一些明显的错误。 ITfCandidateList **ppCandList
无法转换为简单的out:这是指针ITfCandidateList
的指针。
在我看来,您需要将其定义为IntPtr
,然后尝试使用Marshal.PtrToStructure.