0

Visual FoxPro 7 で記述された COM DLL を呼び出す必要がある C# WinForms .NET 3.5 アプリケーションがあります。COM オブジェクトを C# プロジェクトに追加しました。

オブジェクト ブラウザーでオブジェクトとそのメンバーを表示します。

ただし、COM オブジェクトからメソッドを呼び出したり、プロパティにアクセスしようとすると、次の例外がスローされます。

System.AccessViolationException は処理されませんでした Message=保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。ソース = Interop.emscosting スタック トレース: emscosting.ComBaseClass.ShellExecute (文字列 tcItem、文字列 tcAction) で ...

以下は、私が使用している C# コードの例です。

emscosting.ComBaseClass com = 新しい emscosting.ComBaseClass(); com.ShellExecute(ファイル、「TRUE」); <--- ここで例外がスローされます

また、デバッガーのウォッチ ウィンドウで COM オブジェクトのパブリック プロパティのいずれかにアクセスしようとすると、[値] 列に次のように表示されます。

他の VFP アプリケーション、Office アプリケーション、Javascript/Classic ASP で問題なくこの COM オブジェクトを使用しています。

誰かがこの問題を解決するのを手伝ってくれますか?

COM の元の VFP ソース コードはまだありますが、パブリック プロパティを宣言しているコードのスニペットを以下に示します。

可能であれば、COM DLL の書き換えは避けてください。

#If BUILD_AS_COM_OBJECT
Define Class emsCosting As Combase OlePublic
#Else
Define Class emsCosting As Combase
#Endif

CostingsPath = COSTINGS_PATH
Dimension CostingsPath_COMATTRIB[5]
CostingsPath_COMATTRIB[1] = COMATTRIB_NONE
CostingsPath_COMATTRIB[2] = "Contains the path of where the costings get saved" && HelpString
CostingsPath_COMATTRIB[3] = "CostingsPath" && Capitalisation
CostingsPath_COMATTRIB[4] = "String" && Property Type
CostingsPath_COMATTRIB[5] = 0 && Number of parameters

CostingsMaster = COSTINGS_MASTER
Dimension CostingsMaster_COMATTRIB[5]
CostingsMaster_COMATTRIB[1] = COMATTRIB_NONE
CostingsMaster_COMATTRIB[2] = "Contains the filename of the costings master (usually costings.xls)" && HelpString
CostingsMaster_COMATTRIB[3] = "CostingsMaster" && Capitalisation
CostingsMaster_COMATTRIB[4] = "String" && Property Type
CostingsMaster_COMATTRIB[5] = 0 && Number of parameters

Function SetCostingsPath(tcPath As String) As VOID HelpString "This is a test function"
    CostingsPath = tcPath
EndFunc

Function TestFunctionNoParam() AS String HelpString "This is a helpstring"
    Return "\\TEST\ContractReviewCostings\"
EndFunc

……

注: 上記で定義した 2 つのテスト関数はいずれも、例外 System.AccessViolationException で失敗します。

4

1 に答える 1