VB2008によるOCX作成、またはHTMLからのDLL呼び出しは可能でしょうか?

このQ&Aのポイント
  • VB2008ではHTMLからダイアログボックスを呼び出すActiveXを作成できない可能性があります。
  • 最低限「クライアント側からのダイアログボックス起動ができるHTML」「ダイアログボックス起動はVBで作成」という条件を満たせればよいので、(1)(2)で実現できなければ別の方法を探すことにします。
  • VB2008ではAxtiveXコントロールを作成することはできないため、AxtiveX DLLをHTMLから呼び出すことができるかは不明です。
回答を見る
  • ベストアンサー

VB2008によるOCX作成、またはHTMLからのDLL呼び出しは可能でしょうか?

こんにちは。 はじめての投稿になります。 私は現在、「ファイルを開く」のコモンダイアログボックスを起動できるHTML画面を作りたいと思っております。 その画面ではサーバ側のファイルを閲覧させたいのですが、認証やセキュリティなどの観点から、 ダイアログボックスの起動はクライアント側で動作するようにしたいです。 それにあたって、ダイアログボックスを呼び出すオブジェクトをAxtiveXコントロール(OCX)で作成し、 そのOCXをHTMLから呼び出すことで実現できないかと考えました。 そこで、以下のことを調べております。 (1)無償のVB開発環境を使ってAxtiveXコントロールを作成することができるか? (2)AxtiveXコントロールを作成できないなら、AxtiveX DLLをHTMLから呼び出せるか? ちなみに現在使用している「無償のVB開発環境」は、Visual Studioの Visual Basic 2008 Express Edition です。 (1)に関しては、VB6ではAxtiveXコントロールを作成できたと聞きますが、どうもVB2008では(.Netでは)作成できないようです。(現在までに見つけた情報に、「.Netで作成できる」というものがないため) (2)に関しては、VB2008 Express Edition を使って、ダイアログボックスを呼び出す AxtiveX DLL を作成することには成功しています。 VBのCOMクラスのテンプレートにダイアログボックス起動の関数を記述し、ビルドしてdllを作成。 ↓ 別途VBによるWindowsフォームアプリケーションを作成し、「参照の追加」で上記dllを登録してダイアログボックス起動の関数を呼び出す。 という方法で、ダイアログボックスを呼び出せました。 ですので、HTMLの画面からも同じようにdll呼び出しができないかと思ったのですが、現在のところ方法が見つかりません。 ダイアログボックスを開く機能さえあればよく、ユーザーインターフェースは不要なので AxtiveX DLL でもよいと思ったのですが、HTMLからの呼び出しにはDLLではなくOCXを用いるという情報しか見つけられませんでした。 以上のことから、VB2008ではHTMLからダイアログボックスを呼び出すActiveXを作れないのではないか?と思える状態なのですが、それが可能であるという話がもしありましたら、お教えいただきたく思います。 最低限「クライアント側からのダイアログボックス起動ができるHTML」「ダイアログボックス起動はVBで作成」という条件を満たせればよいので、(1)(2)で実現できなければ別の方法を探すことにします。 最後に 必要かどうかわかりませんが、(2)で試しに作ったダイアログボックス呼び出しのCOMクラスのソースを載せておきます。 ご回答の参考になりますでしょうか。 Imports System.Windows.Forms <ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _ Public Class ComClass1 Public Const ClassId As String = "2bdd38a4-f946-44e2-af47-5b9cbd2c24d5" Public Const InterfaceId As String = "fcd22890-f4cd-4e2a-b8c0-ae83f290c250" Public Const EventsId As String = "86c74809-966a-47cf-9324-adce776030eb" Public Sub New() MyBase.New() End Sub Public Function subOpenFile(ByVal inFilePass As String) As Boolean subOpenFile = False 'OpenFileDialogクラスのインスタンスを作成 Dim ofd As New OpenFileDialog() If inFilePass = "" Then ofd.InitialDirectory = "C:\" Else ofd.InitialDirectory = inFilePass End If ofd.Filter = "HTMLファイル(*.html;*.htm)|*.html;*.htm|すべてのファイル(*.*)|*.*" ofd.FilterIndex = 2 ofd.Title = "開くファイルを選択してください" ofd.RestoreDirectory = True ofd.CheckFileExists = True ofd.CheckPathExists = True 'ダイアログを表示 If ofd.ShowDialog() = DialogResult.OK Then Console.WriteLine(ofd.FileName) End If subOpenFile = True End Function End Class (呼び出し側では以下の記述で呼び出しに成功しました) Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Test As New COMTest1.ComClass1 Call Test.subOpenFile("C:\WINDOWS") End Sub 以上、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

> HTMLからのDLL呼び出しは可能でしょうか? EXEなら可能(だだし、色々制限があり) ノータッチ・デプロイメント http://www.atmarkit.co.jp/fdotnet/special/ntdeploy/ntdeploy_01.html > その画面ではサーバ側のファイルを閲覧させたいのですが、認証やセキュリティなどの観点から、 > ダイアログボックスの起動はクライアント側で動作するようにしたいです。 クライアント側からサーバ側のファイルを任意に参照?? どんな方法でも無理でしょう。 > Call Test.subOpenFile("C:\WINDOWS") これはクライアント側のフォルダを開いているだけです。 サーバ側のフォルダをWebで公開したいのであれば、 フォルダを右クリック→Web共有 IISマネージャでフォルダを右クリック→ディレクトリ参照をオン。 HTMLからそのフォルダにリンク。 または WebアプリをASP.NETなどで自作する。

Astra003
質問者

お礼

お礼をしておりませんでした。申し訳ありません。 ノータッチ・デプロイメントで実現できそうです。 ありがとうございました。

Astra003
質問者

補足

ご回答ありがとうございます。 >> Call Test.subOpenFile("C:\WINDOWS") >これはクライアント側のフォルダを開いているだけです。 申し訳ありません。 テストでローカルのフォルダを指定していたことがありまして、その時のソースを載せておりました。 Call Test.subOpenFile("\\サーバの共有フォルダ\フォルダ1\フォルダ1_1") のようにサーバのフォルダを指定して使います。 クライアント側は、 HTMLの画面を使わずともブラウザや「ファイル名を指定して実行」等で サーバの共有フォルダのアドレスを直接入力すれば、フォルダの内容を閲覧できる環境です。 (ですので、subOpenFileでもサーバのフォルダの内容を閲覧できました。) 前提条件の説明が足りておりませんでした。 あとこれも最初に書いていなかったのですが、 VB6の時のActiveXの資料によると、ActiveXコントロールは自分自身をインストールする機能があるとのことですので クライアントからHTML画面のサーバ閲覧の参照ボタンを押下 → ocxかdllのファイルをクライアント側にダウンロード → ダウンロードされたファイルからダイアログボックスを起動 という流れのものをイメージしておりました。 いろいろ説明が足りず申し訳ありません。 >(2)AxtiveXコントロールを作成できないなら、AxtiveX DLLをHTMLから呼び出せるか? その後実験で、VB2008の「クラスライブラリ」のプロジェクトで「ユーザーコントロール」を使って作成したdllを ローカルの仮想ディレクトリに保存し、下記のようにHTMLから呼び出すことはできました。 ※この「呼び出す」は、dllで作成したコントロール(UserControl1)をHTMLの画面上に表示できたという意味です。 <object id="TestControl1" classid="http:DllTest1.dll#DllTest1.UserControl1" height="500" width="500" VIEWASTEXT> </object> 「.NETにおいては、ActiveXコントロールに代わってWindowsフォームコントロールを作成できる」と聞いたので、 このdllがActiveXコントロールに等しいものなのではないかと。 よって、(2)の「dllをHTMLから呼び出す」ということ自体は成功なのですが、これもHTMLファイルとdllを同じ場所に 保存していないと、HTML画面上にdllのコントロールが表示されませんでした。 つまり、クライアント側にあるdllの実行は結局できませんでした。 またdllのコントロールが表示できる場合でも、前述のダイアログボックス起動の処理をコントロールから呼び出そうとすると 「アクセス許可の要求に失敗しました」エラーが出て実行できませんでした。 もし、この補足で何か取れる手段があるようでしたら、お教えください。 そして、 >EXEなら可能(だだし、色々制限があり) 「ノータッチ・デプロイメント」は知りませんでした。 その手段を調べさせていただきます。 ありがとうございます!

関連するQ&A

  • Cで作成したDLLをVBで呼出

    Cで作成したDLLの関数をVB6.0から呼び出す事ができず、悩んでおります。 ご教授お願いします。 どの様な関数を呼び出そうとしているのかというと、以下の通りです。 <DLL Cで作成(コンパイラVC6)> void WINAPI hoge(BSTR pgname,BSTR fmt,...){ ~処理~ } /* 宣言では頭にDLLExport*/ <呼出側 VB6.0で作成> '宣言 Public Declare Function hoge Lib "hoge" _ (ByRef pgname as String , _ ByRef fmt as String , _ ParamArray args()) '呼出 call hoge("foo","baa","array1",2) この様なコードを書いております。 C側、VB側ともに固定数の引数にしてみたところ、 通ったので「ParamArray args()」の定義が違うのではないか・・・?と思っているのですが、 どの様に宣言したらよい物なのでしょうか? もしくは、そもそも全然違う箇所を間違っているのでしょうか? 宜しくお願いします。 ※ 説明の足りない箇所があれば、仰ってください。

  • VB.NETで作成したDLLについて

    ご回答宜しくお願い致します。 現在、VBでユーザーコントロールのDLLを作成し、 DLLをC#で使用するというプログラムを開発してます。 そこで、以下のような現象が起こり 対応できかねております。 まず、VBで以下のメソッドを書きました。 Public Sub showMessage(ByVal bol As Boolean)     MessageBox.Show(bol) End Sub そして、C#からDLLのコントロール ( Panel1 ) を呼び出し、 private void Panel1_MouseClick(object sender, MouseEventArgs e) {     Panel1.setSelectedFlg(true); } これでメッセージボックスが表示されると思ったんですが表示されません。 VBのMessageBoxを別の処理に変えても全く動作しません。 メソッドを動作させる方法はございますでしょうか 宜しくお願い致します。

  • Delphi6でVB.NETで作成のDLL呼出

    VisualSutudio2005で作成され提供されているDLLをDelphi6から呼びだしたいと思っています。 提供ファイルとしてあるのは以下のものです。 ・DLLファイル本体 ・XMLファイル 直接は呼びだせない(?)と思ったので、 VB.NETでDLLを作って間に入れて、 下のように呼び出せばいいのかなと考えています。 Delphi6で作成のEXE → VB.NETで作成のDLL(COM登録?) → 対象のDLL まずはDelphi6のEXE→VB.NETのDLLの部分を作って試してみたですが Delphi6のEXEの起動時にエラーとなってしまいます。 「アプリケーションの初期化に失敗しました」 ネットなどで調べてみて作り方は下記のようにしました。 <呼ばれる側:VB.NETのDLL> 1.COMクラスを作る。   ・COM参照可能の設定にした。 (タイプライブラリが作成され、レジストリへのCOM登録は自動でされる?) 2.作成したDLLはCドライブ直下に置いた。 ※下の*****は自動作成された固定値が入っています。  また見やすくするためここでは半角空白を全角空白に変えています。 -------------------------------------------------------------------- Imports System.Windows.Forms <ComClass(Middle_Dll.ClassId, Middle_Dll.InterfaceId, Middle_Dll.EventsId)> _ Public Class Middle_Dll #Region "COM GUID"   ' これらの GUID は、このクラスおよびその COM インターフェイスの COM ID を   ' 指定します。この値を変更すると、   ' 既存のクライアントはクラスにアクセスできなくなります。   Public Const ClassId As String   = "**************************"   Public Const InterfaceId As String = "**************************"   Public Const EventsId As String  = "**************************" #End Region   ' 作成可能な COM クラスにはパラメータなしの Public Sub New() を指定しなければ   ' なりません。これを行わないと、クラスは COM レジストリに登録されず、   ' CreateObject 経由で   ' 作成できません。   Public Sub New()     MyBase.New()   End Sub   Public Sub DispMsg()     Dim MsgRet As MsgBoxResult     MsgRet = MessageBox.Show("VB.NET DLLより表示!", "確認メッセージ", MessageBoxButtons.YesNo, MessageBoxIcon.Information)   End Sub End Class --------------------------------------------------------------------- <呼び出し側:Delphi6のEXE> 1.タイプライブラリの取り込み設定で登録したDLLを選択し、   「コンポーネントラッパーの作成」にチェックを入れてインストールを実行。 --------------------------------------------------------------------- unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls,OleCtnrs,ComObj, OleServer; type  TForm1 = class(TForm)   Button1: TButton;   Edit1: TEdit;   procedure Button1Click(Sender: TObject);  private   { Private 宣言 }  public   { Public 宣言 }  end; var  Form1: TForm1;  //----------  //静的呼出  //----------  procedure DispMsg();Stdcall; external 'c:\Middle_Dll.dll' name 'DispMsg'; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin  //----------  //静的呼出  //----------  DispMsg(); end; end. ----------------------------------------------------------------- Delphi6のEXEはすでにあるものなので、 呼び出し元はDelphi6から変えられませんが、 呼び出し先はC#やC++でも構いません。 (1)Delphi6のEXE→VB.NETのDLLの呼び出しは可能でしょうか? (2)可能でしたら不具合と思われる箇所はどこでしょうか? (3)この方法より良いと思われる方法はありますでしょうか? DLLを作った事がないので見よう見まねで作っています。 気になる点やアドバイス程度でも構いませんので、 どうかよろしくお願いいたします。 == 開発環境 == WindowsXP SP3 Delphi6 Enterprise SP2 VisualSutudio2005 ProffesionalEdition 評価版 .NET Framework 1.1~3.5

  • Cで作成したDLL関数をVBから呼ぶ(.NET)

    以前の質問に「Cで作成したDLL関数をVBから呼ぶ」(QNo.1703839)がありますが、下記のコードを見るとVB6での内容だと思います。 Dim keydata As String * 128 keydata = String$(128, Chr(0) & Chr(0)) VB.NETでVC++のDLLで変更した文字列を受けたいのですが、 どのようにすればよいのでしょうか? VB.NET2003 <DllImport("DllTest.dll")> Private Shared Function _ Test(ByVal s1 As String) As String End Function Private Sub btnTest_Click(...) ... Dim s1 As String = "abc" Dim s2 As String Dim s3 As String s2 = Test(s1) MessageBox.Show(s2) ' "1"が表示される s3 = StrConv(s2, VbStrConv.None) MessageBox.Show(s3) ' 同じく"1"が表示 end sub VC++のDLL extern "C" __declspec (dllexport) BSTR __stdcall Test(char* s1) { AfxMessageBox(s1); // "abc"が表示される OK strcpy(s1, "123"); CString s2; s2 = "123"; return s2.AllocSysString(); } また、文字列に全角を含めても大丈夫でしょうか? Unicodeの変換処理を行う必要があるのでしょうか? よろしくお願いします。

  • VBで作成したActiveXの実行について

    HTML上でOBJECTタグを使って、OCXなどを実行できるというようなことはネットで見つけることができたのですが、そのOCXがC言語で作られたものだったり、MediaPlayerみたいなものだったりするので、よくわかりません。知りたいことは・・・ 1.VBで作成したActiveXをHTMLで実行できますか? 2.VBで作成したActiveXをHTMLで実行したことがありますか? 3.HTMLで実行するActiveXを作成する場合、DLLですかOCXですか? 4.VBで作成したActiveXを使用する場合、特に気をつけることがありましたら教えて下さい。 以上、よろしくお願い致します。

  • C++で作成したDLLを vb.net から動的に

    C++で作成したDLLを vb.net から動的に使用する方法 <DllImport("DllNAME")> _ Private Shared Function FuncName( _   <MarshalAs(UnmanagedType.LPStr)> ByVal str1 As StringBuilder, _   <MarshalAs(UnmanagedType.LPStr)> ByVal str2 As StringBuilder ) As String End Function Sub huga()   Dim result As String = FuncName( "hoge", "piyo" )   MsgBox(result) End Sub 上記方法で 静的にはリンク出来たのですが 動的にリンクする方法がわかりません ご教授ください お願いします!

  • VBからMFC-DLL呼び出し

    VC++6.0でDLLを作成してVBから呼んでいます。 VC++6.0 __declspec(dllexport) BSTR WINAPI FunA() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strA = _T("This is the テストです。.愛する</CsvData>"); return strA.AllocSysString(); } VB6.0 Private Declare Function FunA _ Lib "Communication.dll" () As String Dim strRet As String strRet = StrConv(FunA(), vbFromUnicode) これを実行すると 『This is the テストです。.愛す?</CsvData>』 がstrRetに格納されます。 『愛する』→『愛す?』になってしまうんですが、 どうしてでしょうか。

  • DLL VBとC++

    VBAからVC++2005のDLLを呼び出すプログラムを書いています。 VB側で作成したcpp_proc関数を呼ぶとVBアプリ自体が落ちました。 DLLのreturnの直前に以下のMessageBoxで表示させるとそこまでは表示され、 リターンを押すと、落ちました。 VB側の引数の値 String * 8192が悪いのでしょうか? return直前まで動作していたので、DLLの戻り値に何か原因があるのでしょうか? ついでの質問ですが、DEFの @1は無くても動くのでしょうか? 意味が知りたいです。 // ----- C++ (DLL側) ----- int __stdcall cpp_proc(LPCSTR inp, LPSTR out) { ... 省略 MessageBox(0, "ここまで通過", "debug", MB_OK); return 0; } // ----- DEF ----- LIBRARY "example" DESCRIPTION 'テスト' EXPORTS ; 明示的なエクスポートはここへ記述できます cpp_proc @1 '----- VB側 ----- Public Declare Function cpp_proc Lib "example.dll" _ (ByVal inp As String, ByRef out As String) As Integer Public Sub Test() Dim ret As Integer Dim inp As String Dim out As String * 8192 ret = cpp_proc(inp, out) MsgBox("ret=[" & Cstr(ret) & "]"); End Sub

  • Cで作成したDLL関数をVBから呼ぶ

    以前にあった「Cで作成したDLL関数をVBから呼び 引数渡し方法」を試したのですがVB側でデータが受け取れません。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=711327 C側での値設定がわるいのでしょうか? VB側 Public Declare Function testAP Lib "C:\bin\test.dll" (ByVal lpKeyData As String) As Long --------------------------------------------------------------------------- Dim lngRc As Long Dim keydata As String * 128 keydata = String$(128, Chr(0) & Chr(0)) lngRc = testAP(keydata) VC側 __declspec(dllexport) long __stdcall testAP(char *lpdata){ →C側でlpdataに値を設定する lpdata="ABCDEF"; }

  • VB5.0のocx?について

    知り合いに聞かれたことなのですが、 VB5.0の開発環境のあるPCについて、 Windows2000からWindowsXPにOSを入れ替えたそうです。 そうしたところ、 VBのダイアログボックスだけがバージョンアップされてしまった、 ということで、 それだけ元のバージョンに戻すのはどうしたらよいでしょうか? ちなみにVB6.0にコンバージョンするとなると、 割と手がかかりそうなので、 ひとまずはVB5.0のままでいくようです。 VB5.0のランタイムをインストールするとか、 どうにかしてocxを入れ替えたらよいのかな? と思うのですが、 最適な対処法がよくわかりません。 ご存知の方がいらっしゃったら、よいと思われる対処法を教えてください。