LabVIEW 内で DLL を呼び出すと、アクセス違反が発生します。DLL を「extcode.dll」と呼びましょう。私はそのコードを持っていません。それは外部の製造業者からのものです。
Windbg で実行すると、次のメッセージで停止しました。
(724.1200): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
ntdll!RtlNewSecurityObjectWithMultipleInheritance+0x12a:
コールスタックは次のとおりです。
ntdll!RtlNewSecurityObjectWithMultipleInheritance+0x12a
ntdll!MD5Final+0xedfc
ntdll!RtlFindClearBitsAndSet+0xdf4
ntdll!RtlFindClearBitsAndSet+0x3a8
ntdll!RtlFindClearBitsAndSet+0x4b9
ntdll!RtlCreateProcessParametersEx+0x829
ntdll!LdrLoadDll+0x9e
KERNELBASE!LoadLibraryExW+0x19c
KERNELBASE!LoadLibraryExA+0x51
LabVIEW!ChangeVINameWrapper+0x36f5
LabVIEW!ChangeVINameWrapper+0x3970
LabVIEW!ExtFuncDynLibWrapper+0x211
アクセス違反の前に、extcode.dll の依存関係が読み込まれることに注意してください。
状況はランダムですが、それが発生すると、後続のすべての試行がそれにつながります。
コードは、DLL 内の関数を呼び出す単純な LabVIEW 関数であり、プロトタイプは非常に単純 ( int function(void)
) であるため、呼び出しパラメータの設定ミスやポインタ演算ではありません。呼び出し規約とエラー チェック レベルのすべての組み合わせをチェックしました。
他の環境 (.NET および C) で呼び出された場合、DLL は完全に正常に動作します。
RtlFindClearBitsAndSet
ビット配列操作に関連していることがわかりました
それはあなたに何を考えさせますか?extcode.dll、LabVIEW、または Windows に問題があると思いますか?
PS: Windows 7 64 ビット (extcode.dll は 64 ビット) で LabVIEW 2010 64 ビットを使用しています。32ビットシステムで再現できませんでした。
11/18 編集
最終的に、DLL をラップするスタンドアロンの exe を作成しました。LabVIEWはパイプを介して通信します。完全に動作しますが、LabVIEW に DLL をロードするとクラッシュする理由がわかりません。