1

環境: VS2005 および VB6 でインストールされた Win7 64 ビット。以前はすべてのアプリケーションが XP で正常に動作していましたが、Win7 64 に移植しています。

A: Win7 VB.NET アプリ、メイン アプリケーション プログラム。B: VB6 でコーディングされた interop com dll。B は、VB6 でコーディングされたさらに別の COM dll を参照します。

A から B への呼び出しは、1) VS2005 デバッグ モードで A を実行している場合、または 2) A を開始プログラムとして VB デバッグ モードで B を実行している場合に正常に動作します。

しかし、A をスタンドアロンで実行している場合、つまり任意の IDE から実行している場合、A は B の呼び出しに失敗します。

最初は、A が B を呼び出すと、メモリ アクセス違反が発生しました。次に、A が B で別のメソッドを呼び出すようにしました。今度は、B が特定の GUI コントロールを見逃したダイアログ ボックスをポップアップしますが、呼び出しによってアプリ全体がクラッシュすることはありませんでした。 .

George の質問: 私は VS2005 と VB6 を管理者として起動したので、デバッグの実行はローカル管理者の下にありました。管理者としてpowershellウィンドウを起動し、そこからアプリケーションを起動したため、スタンドアロンの実行も管理者の下にありました。ありがとう、ジョージ。

はい、ターゲットCPUはX86(「任意のCPU」ではありません)に設定されています.thx tcarvin.

更新: 私は少し進歩しました - いくつかの COM インターフェイスには次のようなコードがあります:

Public Sub Proc (ByRef conn As ADODB.Connection)
Set mbrCN = conn

ここで、mbrCN はクラス モジュールのプライベート メンバーであり、オブジェクトの割り当てを新しいインスタンスの複製に変更しました。

Set mbrCN = New ADODB.Connection
With mbrCN
    .ConnectionString = conn.ConnectionString
    .CursorLocation = adUseClient
    .Open
End With

いくつかの例外メッセージはなくなりましたが、部分的に表示されるフォームの問題にまだ直面しています。具体的には、A が B.method を呼び出します。これにより、サード パーティのグリッド コントロール (VSFlexGrid8.ocx) を含むフォームが表示されます。VS2005 で A をデバッグ実行するか、VB6 で B をデバッグ実行すると、すべてが機能するように見えますが、A をスタンドアロンで実行すると、フォームがポップアップしますが、VSFlexGrid が見つからず、VSFlexGrid について詳しく調べようとしています。相互運用中......

解決済み: VSFlexGrid8.ocx のより最新のビルド (正確には VSFlex8 ビルド番号 8.0.20132.297 ビルド日: 2013 年 9 月 13 日、ファイル名 vsflex8_8.0.20132.297.zip) を見つけ、問題を解決しました。申し訳ありませんが、ダウンロード URL を保持していませんでした。

4

2 に答える 2