8

私はこれを行う方法を知っていると思いましたが、明らかにそうではないので、助けていただければ幸いです。dllを登録できないため、VBSなどでインスタンス化できます。

次のサンプルクラスを作成し、[アセンブリをCOMで表示する]をオンにし、[COM相互運用機能に登録する]をオンにして、ビルドしました。VBSからインスタンス化しようとすると、「ActiveXコンポーネントはオブジェクトを作成できません」というエラーが発生します。

これはクラスコードです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Smurf
{
    public class Pants
    {
        public string Explode(bool Loud)
        {
            string result;
            if (Loud)
                result = "BANG";
            else
                result = "pop";
            return result;
        }
    }
}

...そしてこれはVBSです:

Dim a

Set a = CreateObject("Smurf.Pants")

msgbox("ok")

他に何をする必要がありますか?

ありがとう :)

[編集]

言及するのを忘れました、最初の失敗の後、私はREGSVR32とREGASMを試しました-助けにはなりません!

[/編集]

REGSVR32を試してみると、次のメッセージが表示されることに注意してください。

モジュール「C:... \ Smurf.dll」がロードされましたが、エントリポイントDllRegisterServerが見つかりませんでした。「C:... \ Smurf.dll」が有効なDLLまたはOCXファイルであることを確認してから、再試行してください。

それはどれくらい役に立ちますか?

これはコードの最新バージョンです:

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

namespace Smurf
{
    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
    public interface IPants
    {
        [DispId(1)]
        string Explode(bool Loud);
    }

    [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
        InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IPantsEvents
    {
        string Explode(bool Loud);
    }

    [ComVisible(true)]
    [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
        ClassInterface(ClassInterfaceType.None),
        ComSourceInterfaces(typeof(IPantsEvents))]
    public class Pants : IPants
    {
        public Pants() { }

        [ComVisible(true)]
        [ComRegisterFunction()]
        public static void DllRegisterServer(string key) { }
        [ComVisible(true)]
        [ComUnregisterFunction()]
        public static void DllUnregisterServer(string key) { }

        [ComVisible(true)]
        public string Explode(bool Loud)
        {
            string result;
            if (Loud)
                result = "BANG";
            else
                result = "pop";
            return result;
        }
    }
}
4

1 に答える 1

10

ここでは、いくつかの異なることが行われている可能性があります。まず、昇格したコマンドプロンプトから/ codebase / tlbスイッチを指定してregasmツールを使用する必要があります(Windows Vista、7、またはWindows Server 2008を想定)。何かのようなもの:

regasm "Path to Smurf.dll" /codebase /tlb

regasmを使用してdllを登録すると、VBS、VBA、またはVB6を使用してdllを呼び出すことできるようになります。

VBAのアーリーバインディングとレイトバインディングを使用してExplodeメソッドを呼び出すことができました。しかし、VBScriptから試してみると、「ActiveXはオブジェクトエラーを作成できません」というメッセージが表示されました。

私はWindows764ビットで実行していますが、32ビットdllにコンパイルして64ビットオペレーティングシステムで実行すると問題が発生する可能性があることを思い出しました。気まぐれに、コマンドプロンプトを起動して、次のように入力しました。

C:\Windows\SysWow64\CScript.exe "Path to VBScript"

その結果、スクリプトは正しく実行され、画面に「ポップ」と表示されました。

これは、私が使用したやや簡略化されたC#コードと、VBScriptファイルの内容です。

namespace Smurf
{
    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
    public interface IPants
    {
        string Explode(bool Loud);
    }

    [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
     InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IPantsEvents
    {
        string Explode(bool Loud);
    }

    [ComVisible(true)]
    [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces(typeof(IPantsEvents))]
    public class Pants : IPants
    {

        [ComVisible(true)]
        public string Explode(bool Loud)
        {
            string result;
            if (Loud)
                result = "BANG";
            else
                result = "pop";
            return result;
        }
    }
}

VBScript:

Dim x 
Set x = CreateObject("Smurf.Pants")
MsgBox (x.Explode(False))
Set x = Nothing
于 2012-07-25T18:10:35.590 に答える