【问题标题】:Call WPF Windows from COM within a Delphi App在 Delphi 应用程序中从 COM 调用 WPF Windows
【发布时间】:2012-02-25 03:26:47
【问题描述】:

我试图调用此处描述的 COM-Object

Is it possible to package WPF window as COM Object

来自 Delphi 应用程序。

导入 tlb 后,我正在使用此代码调用该 COM 对象。

var
  y: ITestWpfInterface;
begin
  y:=CreateComObject(CLASS_TestWpfInterface) as ITestWpfInterface;
  y.TestWpf();
end;

COM 对象被实例化并调用该方法。 但是当它到达

时,COM 对象会使 Delphi 应用程序崩溃
Window1 form = new Window1();

线。当我尝试从 word-VBA 执行相同操作时,会显示 wpf 窗口。

Sub test()
  Dim x As New WpfControlLibrary1.TestWpfInterface
  x.TestWpf
End Sub

新窗口周围的catch 块不显示任何异常。 我已经用windbg调试了应用程序。在加载框架 wpf 程序集的

后,它向我显示了 div by 0 异常

为什么 delphi 应用程序会崩溃?是什么导致了崩溃。如何解决?

编辑: 这是windbg的输出

ModLoad: 76330000 7634d000   C:\WINDOWS\system32\IMM32.DLL
ModLoad: 5b0f0000 5b128000   c:\windows\system32\uxtheme.dll
ModLoad: 75250000 7527e000   C:\WINDOWS\system32\msctfime.ime
ModLoad: 76f90000 7700f000   C:\WINDOWS\system32\CLBCATQ.DLL
ModLoad: 77010000 770e3000   C:\WINDOWS\system32\COMRes.dll
ModLoad: 79000000 7904a000   C:\WINDOWS\system32\mscoree.dll
ModLoad: 603b0000 60417000   C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscoreei.dll
ModLoad: 76970000 76a21000   C:\WINDOWS\system32\sxs.dll
ModLoad: 79140000 797ae000   C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\clr.dll
ModLoad: 79060000 7911e000   C:\WINDOWS\system32\MSVCR100_CLR0400.dll
ModLoad: 77f40000 77fb6000   C:\WINDOWS\system32\SHLWAPI.dll
(2b4.244): Unknown exception - code 04242420 (first chance)
ModLoad: 79880000 7a641000   C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\mscorlib\a774bd593b8420bae4a8cf1d46af3ba2\mscorlib.ni.dll
ModLoad: 60340000 6034d000   C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\culture.dll
ModLoad: 60930000 60940000   C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\nlssorting.dll
ModLoad: 03270000 03549000   C:\WINDOWS\system32\xpsp2res.dll
ModLoad: 79810000 79870000   C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\clrjit.dll
ModLoad: 7a830000 7b0dd000   C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\System\5286fe2d0167eb835a9f11025f1cb756\System.ni.dll
ModLoad: 58c20000 58fd1000   C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\WindowsBase\9dacf8a5033dfbcb435be166d2f42cdf\WindowsBase.ni.dll
ModLoad: 68000000 68036000   C:\WINDOWS\system32\rsaenh.dll
ModLoad: 55590000 5607d000   C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\PresentationCore\8244412387a82c0acd3d63622e22cef5\PresentationCore.ni.dll
ModLoad: 56980000 57aad000   C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\PresentationFramewo#\813a0913bea1269e48613509609e72b4\PresentationFramework.ni.dll
ModLoad: 561c0000 562a1000   C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\WPF\wpftxt_v0400.dll
ModLoad: 55000000 5519a000   C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\WPF\wpfgfx_v0400.dll
ModLoad: 554c0000 55585000   C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationNative_v0400.dll
ModLoad: 59200000 593b5000   C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\System.Xaml\a3ffdc1316821b5ceb32c9a788334329\System.Xaml.ni.dll
ModLoad: 60c90000 60d83000   C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\System.Configuration\4844dd28e0611d1ebd1e449fe822c2a5\System.Configuration.ni.dll
ModLoad: 69760000 69cbe000   C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\System.Xml\419103071a5a5d17738afbe9dd03d58a\System.Xml.ni.dll
(2b4.244): Unknown exception - code c0000090 (first chance)
(2b4.244): Unknown exception - code c0000090 (first chance)
(2b4.244): Unknown exception - code c0000090 (first chance)
eax=000000c0 ebx=00007530 ecx=001b1e30 edx=00000020 esi=00000000 edi=0374ff50
eip=7c91e514 esp=0374ff20 ebp=0374ff78 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
ntdll!KiFastSystemCallRet:
7c91e514 c3              ret

可以在此处找到包含此问题的示例代码的德语版本: http://www.delphipraxis.net/166199-com-interop-mit-einer-c-library-mit-wpf-und-com.html

【问题讨论】:

  • 您是否尝试将 COM 对象作为组件导入 delphi 中?
  • 我尝试了早期绑定和后期绑定。两者都使该应用程序崩溃。 crash = delphi 应用程序立即关闭。
  • 如果不使用 regasm 注册 com 对象,则无法获取该对象的实例。 regasm 也用于生成 tlb。这个 tlb 被导入到 delphi 中。一切都很好,除了 dotnet 正在创建 wpf 窗口。

标签: .net wpf delphi com com-interop


【解决方案1】:

delphi 不会掩盖 fpu 中引发的 wpf 异常。

通过设置异常掩码,fpu 会忽略这些异常。

SetExceptionMask(
    [exInvalidOp, exDenormalized, exZeroDivide, 
    exOverflow, exUnderflow, exPrecision]
);

此函数位于数学单元中。

http://docwiki.embarcadero.com/VCL/en/Math.SetExceptionMask

感谢 Bernhard Geyer,他提出了这个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多