如何在C#中正确使用CreateTextServices、ITextHost? 我想实现一个无窗口的富文本框,但是我只找到了一些C++实例,我想在C语言中实现它,但是调用CealTestService函数总是有一个错误(“FatalExecutionEngineError”)。

如何在C#中正确使用CreateTextServices、ITextHost? 我想实现一个无窗口的富文本框,但是我只找到了一些C++实例,我想在C语言中实现它,但是调用CealTestService函数总是有一个错误(“FatalExecutionEngineError”)。,c#,.net,winforms,winapi,richtextbox,C#,.net,Winforms,Winapi,Richtextbox,为任何CPU编译平台,Win10(x64)运行正确,Win7(x86)运行错误。在Win7上编译后,Win10也可以正确运行 protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); try { IntPtr pUnk = IntPtr.Zero; if (WinAPI.CreateTextServices(IntPtr.Zero, thi

为任何CPU编译平台,Win10(x64)运行正确,Win7(x86)运行错误。在Win7上编译后,Win10也可以正确运行

protected override void OnHandleCreated(EventArgs e)
{
    base.OnHandleCreated(e);
    try
    {
        IntPtr pUnk = IntPtr.Zero;
        if (WinAPI.CreateTextServices(IntPtr.Zero, this, out pUnk) < 0)
            throw new Win32Exception();

        //Guid iid = typeof(WinInterface.ITextServices).GUID;
        //Marshal.QueryInterface(pUnk, ref iid, out ppv);
        //services = (WinInterface.ITextServices)
        //    Marshal.GetTypedObjectForIUnknown(ppv, typeof(WinInterface.ITextServices));

    }
    finally
    {
        //Marshal.Release(pUnk);
    }
}
[DllImport(ExternDll.Msftedit, SetLastError = true, CharSet = CharSet.Auto)]
public static extern int CreateTextServices(
            IntPtr punkOuter,
            WinInterface.ITextHost pITextHost,
            out IntPtr ppUnk
            );
受保护的重写无效OnHandleCreated(EventArgs e)
{
碱基。根据HandleCreated(e);
尝试
{
IntPtr朋克=IntPtr.0;
if(WinAPI.CreateTextServices(IntPtr.Zero,this,out pUnk)<0)
抛出新的Win32Exception();
//Guid iid=typeof(WinInterface.ITextServices).Guid;
//元帅询问界面(朋克,参考iid,外部ppv);
//服务=(WinInterface.ITextServices)
//GetTypedObjectForIUnknown(ppv,typeof(WinInterface.ITextServices));
}
最后
{
//元帅释放(朋克);
}
}
[DllImport(ExternDll.Msftedit,SetLastError=true,CharSet=CharSet.Auto)]
公共静态外部int CreateTextServices(
IntPtr punkOuter,
WinInterface.ITextHost pITextHost,
out IntPtr ppUnk
);

我正在使用VS2017和VS2013,为什么会发生此错误,目前我找不到任何线索。

我感觉此库是错误地使用
\uuu fastcall
编译的,并且由于后台原因一直如此。这与64位代码(仅限单次调用约定)而非32位代码的症状是一致的。@David Heffernan使用Win32 project编译,它可以在64位和32位上运行。我根本不清楚所有组件的位数。如果你做了一些研究,我想你会发现我对fastcall的看法是正确的。我也有同样的问题,经过一些研究,我认为问题并不是来自
CreateTextServices
,它使用了
stdcall
,而是来自.NET中的
ITextHost
实现。如果查看
textserv.h
ITextHost
接口方法没有定义调用约定(这对于COM对象来说非常不寻常,它应该是
stdcall
),因此实际上是
thiscall
。因此,在调用
CreateTextServices
时会发生崩溃,因为它的实现会回调到它使用的第一个主机函数,该函数恰好是
ITextHost::TxGetPropertyBits
@SimonMourier非常感谢。我很高兴在经历了几个小时的挫折之后找到了答案。我感觉这个库是用
\uu fastcall
错误地编译的,并且由于一些原因一直如此。这与64位代码(仅限单次调用约定)而非32位代码的症状是一致的。@David Heffernan使用Win32 project编译,它可以在64位和32位上运行。我根本不清楚所有组件的位数。如果你做了一些研究,我想你会发现我对fastcall的看法是正确的。我也有同样的问题,经过一些研究,我认为问题并不是来自
CreateTextServices
,它使用了
stdcall
,而是来自.NET中的
ITextHost
实现。如果查看
textserv.h
ITextHost
接口方法没有定义调用约定(这对于COM对象来说非常不寻常,它应该是
stdcall
),因此实际上是
thiscall
。因此,在调用
CreateTextServices
时会发生崩溃,因为它的实现会回调到它使用的第一个主机函数,该函数恰好是
ITextHost::TxGetPropertyBits
@SimonMourier非常感谢。我很高兴在经历了几个小时的挫折后找到了答案。