2012-02-02 3 views
2

내.전화 WPF 윈도우 COM에서 델파이 응용 프로그램

tlb를 가져온 후이 코드를 사용하여 해당 COM 개체를 호출합니다.

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

COM 개체가 인스턴스화되고 메서드가 호출됩니다. 그것은

Window1 form = new Window1(); 

라인에 도달 할 때 하지만 COM 개체는 델파이 응용 프로그램을 충돌합니다. 내가 단어 - VBA에서 동일한 작업을 수행하려고 할 때 wpf 창이 표시됩니다.

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

새 창 주위의 catch 블록에는 예외가 표시되지 않습니다. windbg로 응용 프로그램을 디버깅했습니다. 프레임 워크 wpf 어셈블리를로드 한 후 div가 0 예외로 표시됩니다.

왜 델파이 앱이 중단됩니까? 무엇이 충돌을 일으키는가? 그것을 해결하는 방법?

편집

: 이 여기에서 찾을 수 있습니다

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 

이 질문에 포함 된 샘플 코드의 독일어 버전을 WINDBG의 출력입니다 : http://www.delphipraxis.net/166199-com-interop-mit-einer-c-library-mit-wpf-und-com.html

+0

델파이에서 COM 개체를 구성 요소로 가져 오려고 했습니까? – whosrdaddy

+0

나는 초기 바인딩과 후기 바인딩을 모두 시도했다. 두 응용 프로그램이 충돌합니다. crash = 델파이 앱의 즉시 종료. –

+0

com 객체를 regasm에 등록하지 않고 객체의 인스턴스를 가져올 수 없습니다. regasm은 또한 tlb를 생성하는 데 사용됩니다. 이 tlb는 delphi로 임포트됩니다. dotnet이 wpf 창을 만드는 것을 제외하고는 모든 것이 문제가되지 않습니다. –

답변

1

델파이는 WPF에서 예외를 마스크하지 않는 fpu에서 자랐다.

예외 마스크를 설정하면 fpu에서 이러한 예외를 무시합니다.

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

이 기능은 수학 단위에 있습니다.

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

덕분에 이런 생각을 했었 베른 하르트 게 이어,로 이동합니다.