• 締切済み

ActiveX の作り方について教えて下さい

以下の環境でMSのVC++ で ActiveX を作成しようとしているのですが、 うまくアクセス出来ません。   プラットフォーム:WindowsVista   VC++ :Ver.6 ActiveX の作り方について教えて下さい。 『プロジェクト』の『MFC ActiveX ControlWizard』を指定し、 プロジェクト名:Sample でプログラムを作成し、 下記の内容で、Variant 型のメソド:RetVariant を作成ました。 ┌─────────────────────────────── │ 1: VARIANT CSampleCtrl::RetVariant() │ 2: { │ 3: static VARIANT vaResult; │ 4: VariantInit(&vaResult); │ 5: // TODO: ここにディスパッチ ハンドラ コードを追加してください。 │ 6: │ 7: vaResult.vt = VT_I4; │ 8: vaResult.lVal = 1234; │ 9: │10: return vaResult; │11: } └─────────────────────────────── これを『C:\Windows\System32』にコピーし、『regsvr32.exe』で登録しました。 その後、少し古いですが、Excel2000 のVBAで下記のプログラムを実行すると、 正しく機能し、『1,234』と表示されました。 ┌─────────────────────────────── │ 1: Dim Obj │ 2: Dim ZZ │ 3: │ 4: Set Obj = CreateObject("SAMPLE.SampleCtrl.1") │ 5: │ 6: ZZ = Obj.RetVariant │ 7: MsgBox FormatNumber(ZZ,0) └─────────────────────────────── これをVBSで実行しようとすると、以下の様なエラーとなってしまいます。 ┌─────────────────────────────── │ 行: 6 │ 文字: 5 │ エラー: 致命的なエラーです。 │ コード: 8000FFFF │ ソース: (null) └─────────────────────────────── 4行目の所を『Set Obj = WScript.CreateObject("SAMPLE.SampleCtrl.1")』 としても同じでした。 どうしてVBAではOKで、VBSではNGになるのでしょうか。 どの様にしたらエラーを解消出来るのでしょうか。

みんなの回答

回答No.1

Control として作成すると VBS ではダメなんじゃないでしょうか。 Excel ではシートや UserForm にコントロールを貼り付けることができますが、VBS ではそうした「コントロールを貼り付けられるもの」がありませんよね。 ATL の シンプル COM オブジェクトで作成してみてはどうでしょう。 http://www.codeguru.com/cpp/com-tech/atl/tutorials/article.php/c17 COM の場合、VARIANT を返すメソッド RetVariant の C++ 側の実装は STDMETHODIMP CSampleClass::RetVariant( VARIANT *var ) となります( 戻り値は HRESULT 型になります。)が、VBS 等から ZZ = obj.RetVariant で呼び出すことが可能です。

関連するQ&A

  • C#で使えるオブジェクトを作成するには

    VisualC++のMFCを利用して、C#でも簡単に使えるオブジェクトを作成したいです。 MFCのオートメーションをサポートするDLLを作成しまして、 メソッドは echo とします。 VBSでは、 dim obj set obj = CreateObject("mytest.test") MsgBox obj.echo("hello") で簡単にオブジェクトを利用することができますが、 WEBで探したら、C#は結構面倒です。 MFCでどうやってオブジェクトを作ったら、 C#でもVBSのように簡単に使えるでしょうか。 ひとつ案として、ActiveXコントローラーを作ったら、 C#のフォームに貼り付けて、それならば、簡単にメソッドを呼び出すことができます。でも、GUIが必要になっちゃいます。 できればC#でこんな風に、  Mytest.test obj = new Mytest.testClass(); MessageBox.Show(obj.echo("hello")); 見たいなことをしたいです。 MFCでどうやってこのような Mytest.test を作れるでしょうか。 よろしくお願いします。

  • ActiveX コンポーネントを作成できません

    Excel2007 WinVista32ビット Adobe Reader 9 Ver9.5.5 を使用しています。 ExcelVBAでPDFを操作するコードを作成したところ、CreateObject関数のところで(※) 「ActiveX コンポーネントを作成できません。」のエラーが出てしまっています。 色々ネットで調べて宣言を変更したりしたのですが上手くいきません。今はこの2行だけでもエラーが出ます。  Dim aaa As Acrobat.CAcroAVDoc  aaa = CreateObject("AcroExch.AVDoc") ※  Dim aaa As Acrobat.CAcroAVDocを   (1)Dim aaa As new Acrobat.CAcroAVDoc (2)Dim aaa As object   (3)Dim aaa にしてもだめでした 最終的にはPFDファイルのページ数が知りたいのですが・・・・・・ Adobe ReaderはProfessionalではありません この環境でどうにかする事できませんか?

  • 並列動作しない?ActiveX EXE

    たびたび申しわけありません。 質問番号:5696830で質問した者です。 自分なりに調べ、アウトプロセスで動くと思われるActiveX EXEを使用した プログラムを行ってみましたが… 並列動作しません…プログラム的には、 ActiveX EXE → Project1 Class1の中の 関数の中に、   For i=0 to 10   Sleep(1000)   Next クライアントVBA → 上記参照設定後 Dim obj As MyComponent.MyClass Set obj = New MyClass 関数実行! としました。問題なく動作はします。 しかし、並列処理ではなく、関数実行終了(Forループ終了)まで 戻ってきません。これでは、ActiveX EXEを使用した目的が…? このような具合です。 私のプログラム構造上、おかしな箇所はありませんでしょうか? よろしくお願いいたします。

  • ActiveXプロジェクトの作成について

    お世話様です。 VC++初心者です。 いままでにWin32Applicationサンプルプログラムなどの製作を少ししていたのですが、今回某メーカ製ActiveXを使った表示・操作のwindows画面を作ることになりました。 MFCActiveXContorolWizardでプロジェクト作成する必要があるようなのですが、ステップを超えた事をやると訳がわからなくなるので心配です。 特にWinmain(入り口)はどこにあるのでしょう。 CALLBACK関数はどこへ消えるのでしょうか。 御助言宜しくお願い致します。

  • ActiveXコントロールのHTMLへの貼り付け方その2

    たびたび恐れ入ります。 自作ActiveXコントロールをHTMLに貼り付けたいのですが、まず、MFC ActiveX Control Wizardでスケルトンを作成しました。 (smp01というプロジェクトにしてあります) これは円を表示する機能を持っていますよね。 ひとまずこれをHTMLに貼り付けて表示したいのですが、うまくいきません。 なにが間違っているのか、抜けているのかも分かりません。 HTMLのサンプルは以下のとおりです。 <HTML> <HEAD> <TITLE> ActiveXコントロールサンプル01 </TITLE> </HEAD> <BODY> <OBJECT ID="smp01" WIDTH="100" HEIGHT="100" CLASSID="clsid:918576E5-324D-4480-825B-5B35A317594B" CODEBASE="d:/vc/smp01/Debug/smp01.ocx#Version=1,0,0,1"> </OBJECT> </BODY> </HTML> どうぞ宜しくお願いします。

  • ActiveX → VB を起動するとCreateObjectできない。

    初めまして。 2003Server+IIS6.0の環境でASP内のActiveXからShell関数でvbのexeを実行させる処理を作成しております。 サーバーから直接exeを実行させると正常に動くのですが、Web上からasp→ActiveX→exeを起動させるとテキストに書き込む処理はできるのですが、「CreateObject」文で「ActiveX コンポーネントはオブジェクトを作成できません」というエラーが返ります。 VB内でなぜ「CreateObject」が出来ないのかご存知の方はいますでしょうか。 宜しくお願いいたします。

  • VBAの関数で引数渡しでエラー

    関数呼び出しでObject型を渡したいのですが「引数の型が一致していません」との エラーになってしまいます。 以下のプログラムをどのように修正すればよいのでしょうか? Sub Test() Dim obj As Object Set obj = CreateObject("Scripting.Dictionary")     :   Sample(obj) End Sub Function Sample(obj As Object) End Function

  • VC++6.0で作成されたActiveXコントロール

    まだプログラミングを始めて日が浅いため、馬鹿な質問をしていたら申し訳ありません。 現在、ActiveXコントロールを使ったプログラムを作成しております。 メインの環境がVC++2008なのですが、このActiveXコントロールがVC++6.0で作られた物であるため、VC++2008で使用しようとするとエラーが出てしまいます。 またプログラム中で使っているライブラリの中でVC++6.0で動いてくれないものもあり、私としては慣れないVC++6.0より何とかして2008でこれを使いたいのですが・・・ 一応現在はVC++6.0でこのActiveXコントロールを動作させるプログラム(以下exeと略)を作り、このexeをVC++2008のプログラム内でCreateProcess関数で呼び出すと言う方法を取っています。 引数はコマンドライン引数、処理結果はファイル経由で受け渡しをしています。 このActiveXコントロールというのがあるカメラから画像を取得するものですので、どうして処理時間の長さが気になります。 そこでプロセスの起動と終了にかかる無駄な時間を減らすため、このexeをDLL化できないものかと考えています。 前置きが長くなりましたが、私が質問したいことは (1)「VC++6.0で作られたActiveXコントロール」を使用したDLLを作れるのか?作れるのならばそれはVC++2008で使えるのか? (2)DLL化以外に処理時間を短くする方法はないか?(例えばexeを立ち上げっぱなしにしたまま引数等をメインプログラムとやり取りできないか?) の2点です。 なおこのActiveXコントロールはソースがないため、VC++2008でビルドしなおすと言う手が使えません。 よろしくお願いします。

  • VBSでXMLを読込、検索結果をテキスト出力

    VBSのソースについてご教授下さい。 【作りたい機能】 XMLファイルを読み込み、任意のエレメントを検索するスクリプトを VBSで作成しようとしています。 【状況】 ダイアログで表示させる方法はわかりました。  参照  http://www.atmarkit.co.jp/fxml/rensai/msxml01/msxml03.html 01 : Dim objDOM, rtResult 02 : 03 : Set objDOM = WScript.CreateObject("MSXML2.DOMDocument") 04 : rtResult = objDOM.load("Sample.xml") 05 : If rtResult = True Then 06 : procDispDatas objDOM.childNodes 07 : End If 08 : Set objDOM = Nothing 09 : 10 : Sub procDispDatas(objNode) 11 : Dim obj 12 : For Each obj In objNode 13 : If obj.nodeType = 3 and obj.parentNode.nodeName = "title" Then 14 : MsgBox obj.parentNode.nodeName & " : " & obj.nodeValue 15 : End If 16 : If obj.hasChildNodes Then 17 : procDispDatas obj.childNodes 18 : End If 19 : Next 20 : End Sub この結果をテキストファイルに出力させる方法に 困っております。 どこにどのように記載すればいいか 教えていただきたく存じます。 よろしくお願いいたします

  • ActiveX EXEのオブジェクトに渡したオブジェクトが微妙

    またまた微妙な質問ですみません。 ------- ActiveX EXEプロジェクト Class Hoge Public Sub Moge(lst) Dim Cast As ListBox MsgBox TypeName(lst) 'ListBoxと表示される Set Cast = lst 'ここがエラー Cast.List(2) = "hogehoge" 'キャストはできないがVariant型のままのアクセスは可能 End Sub ------- 標準EXE Class Form1 (List1を配置) Dim X As New Hoge Private Sub Form_Load() X.Moge List1 End Sub ----- このように、アウトプロセスのオブジェクトにフォームのコントロールを渡しました。 引数の型をAs ListBoxにしたかったのですが、それだとまずそこで型が一致しないといわれます。 しようがないのでVariantで引数を宣言し、渡した後にキャストしようと思ったのですが、そこでも型が一致しないといわれます。 TypeName関数は "ListBox" を返すし、Variant型のままメンバにアクセスすることはできるのですが、ListBox型の変数に代入することだけできないのです。 別プロセスのオブジェクトには、オブジェクトの参照は渡せないのでしょうか?

専門家に質問してみよう