2

これを解決する方法を見つけようとしています。インターネットで見た多くのことを試しましたが、成功しませんでした。私は試しました: regasm を使用する、ターゲットを x86 としてコンパイルする、dumpbin dll /t:dll.tlb を使用する、Framework のバージョンを変更するなど。

Windows 7 64 と VS2012 を搭載した 2 台のマシン (M1 と M2) があります。M1 で COM を開発すると、M1 の VBA で問題なく動作します。ただし、M2 では機能しません (エラー 429)。次に、M2 に移動して新しい COM を作成すると、M2 の VBA では正常に動作しますが、M1 では動作しません。

VS2012 は、私には見えない「非表示」の登録ステップを実行しているようです。誰かがそれを見つける方法を知っていますか?

どうもありがとう!以下は私の「COM Hello World」です。Register for COM interop も使用しています。

アップデート:

私が実行した場合:

C:\windows\Microsoft.NET\Framework\v4.0.30319\regasm TesteLib.dll /TesteLib.tlb 

429 エラーが消えます。しかし、エラー 429 の代わりに、同じ行に「エラー -2147024894 (80070002) オートメーション エラー」が表示されます。

Can't instantiate a COM object written in VBA (VB6 ok)のソリューションに従って、EXCEL.exe フォルダー内に Excel.Exe.Config を作成すると、プログラムが正常に動作するようになりました。しかし、クライアント マシンではこれを実行できないと思います。それに代わるものはありますか?

また、VB6 でも問題なく動作します (REGASM を実行する必要はありません)。

.net側

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace TesteLib
{
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    [Guid("c6b093c6-f568-4962-8955-795fc14f34bb")]
    [ComVisible(true)]
    public interface ClassInt1
    {
        int sum(int a, int b);
    }

    [ClassInterface(ClassInterfaceType.None)]
    [Guid("19ff9b41-8652-4012-ac55-c1a1d8f18cbb")]
    [ComVisible(true)]
    [ProgId("TesteLib.Class1")]
    public class Class1 : COMException, ClassInt1
    {
        public int sum(int a, int b)
        {
            return a + b;
        }
    }

}

VBA側

Sub t()
    Dim r As TesteLib.Class1
    Set r = New TesteLib.Class1 'Run-time error '429': ActiveX component can't create object
    MsgBox r.Sum(35, 51)
End Sub
4

1 に答える 1

3

今、それは働いています!

オプション /codebase を指定して REGASM を使用して DLL を登録する必要がありました。

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm /codebase TesteLib.dll 

オプション /codebase を含めると、警告が生成されますが、機能します。/codebase スイッチは、署名されたアセンブリでのみ使用することを目的としています。アセンブリに厳密な名前を付けて、再登録してください。

次に、VS2012 で、[プロジェクト プロパティ] > [署名] > [アセンブリに署名] > [新規...] オプションをマークし、REGASM を実行しました。警告はフェードアウトし、すべてがうまくいっているようです:)

ありがとう!

于 2013-09-24T15:01:01.413 に答える