こんにちは。
はじめての投稿になります。
私は現在、「ファイルを開く」のコモンダイアログボックスを起動できる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
以上、よろしくお願いいたします。
お礼
お礼をしておりませんでした。申し訳ありません。 ノータッチ・デプロイメントで実現できそうです。 ありがとうございました。
補足
ご回答ありがとうございます。 >> 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なら可能(だだし、色々制限があり) 「ノータッチ・デプロイメント」は知りませんでした。 その手段を調べさせていただきます。 ありがとうございます!