これを解決する方法を見つけようとしています。インターネットで見た多くのことを試しましたが、成功しませんでした。私は試しました: 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