質問者
ASPからのCOMの呼び出しについて

質問
-
ASP(ASP.NETではない)から、VB6のOCXをCAB形式にしたCABファイルを呼び出しているページがあります。
そのCABファイルをVB.NETで作成したアセンブリに変更しなければならないのですが、”オブジェクトでサポートされていないメソッドです”というメッセージが表示され
うまく呼び出すことができません。
・CABファイルにする必要があるか?
・ASPから呼び出すためのアセンブリはどのように作成するべきなのか?
・ASP側の修正が必要なのか、?
など基本的なことからわかりません。原因と対処方法を教えていただけないでしょうか。
アセンブリは
VISUAL STADIO 2010でクラスライブラリを作成し、COM相互参照機能にチェックし、
regasmを実行し作成したDLLをCABファイルにしました。また、ASPは次の内容で、CABファイルを呼び出しています。
==================
<% @LANGUAGE="VBSCRIPT"%>
<% OPTION EXPLICIT %>
<% RESPONSE.BUFFER=TRUE%>
<%<script LANGUAGE="VBScript">
<!--
'------------------------------------
' 印刷プレビューを表示
'------------------------------------
Sub Preview1()
With document.UserConViewKyn
.Kenmei = "TEST"
.RunRpt (sStatus)
End With
End Sub
-->
</script>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<meta http-equiv="Pragma" content="no-cache">
</head>
<body onLoad="Preview1();">
<form name="frmMain" "next.asp" method=post ID="Form1">
<OBJECT ID="UserConView"
CLASSID="CLSID:d40a8a24-3482-4476-aa05-978162792b75"
CODEBASE="../exe/AcxAAAAA.cab#version=3,2,1,0" VIEWASTEXT>
</OBJECT>
</form>
</body>
</html>
==================以上よろしくお願いいたします。
すべての返信
-
アセンブリは
VISUAL STADIO 2010でクラスライブラリを作成し、COM相互参照機能にチェックし、
regasmを実行し作成したDLLをCABファイルにしました。単に cab ファイルと圧縮すればよいわけではありません。
また、VB6 → VB.NET で単純に置き換えで済むレベルじゃないと思いますので方針の見直しも視野に入れた方がよいかもしれません。いわゆる ActiveX コントロールの cab ファイルは inf ファイルとセットで圧縮され、署名されていると思います。
inf ファイルで登録するためには、普通の regsvr32 で登録できる形である必要があると予想されますが、.NET の DLL は regasm でなければ登録できません。
従って、cab ファイルでの展開ができない可能性があります。そもそも、.NET Framework を誰がインストールするのかという問題も残りますね。
// 渋木さんが指摘しているように、ブラウザー上で object タグから実行するのであれば、
// それを見るクライアント側、利用者側に .NET Framework とそのアセンブリが必要です。
// そして、それは regasm で登録されている必要がある。
// ここまでをアクセスしただけで実現する仕組みを述べたドキュメントは…ないかも?
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
- 編集済み AzuleanMVP, Moderator 2012年3月19日 14:18
-
>regasm はどこで実行しましたか?
regasmは、開発機で行いまして、サーバでは行っていません。
サーバにはMicrosoft Visual Studioをインストールしていないので、regasmがありません。MSのサイトからダウンロードまたはインストーラなどでインストールする必要があるのでしょうか?(このあたりがまったく分かりません。)
また、
>object タグに埋め込まれているオブジェクトは、どこで実行されると考えていますか?
正直考えていませんでしたが、ブラウザで参照する各端末になるのですよね?
そうなると各端末にもregasmは必要になるということでしょうか?
-
ご回答ありがとうございます。
>単に cab ファイルと圧縮すればよいわけではありません。
>また、VB6 → VB.NET で単純に置き換えで済むレベルじゃないと思いますので方針の見直しも視野に入れた方がよいかもしれません。うすうす単純にはいかない気がしていました。
方針の見直しを視野に入れたうえで、
極力作業量を減らしたいのですが、根本的には、ASPからOBJECTタグを使用して、.NET Frameworkで
作成したアセンブリを使えるようにしたいというだけです。
CABでなくてもかまいません。
どのようにすればいいのでしょうか?
質問が漠然としてしまうかもしれませんが、なんとかご回答よろしくお願いいたします。
-
プログラムをどこで実行するのか、とても重要なことです。理解されたようですが、
objectタグに埋め込まれCLASSIDで指定されたクラスは、当然ながらWebブラウザー上で実行されます。(当該クラスを実行できるようにするためにregasmされるのでしたら)「各端末にもregasmは必要になる」ではなく「各端末にregasmは必要になる」です。もちろん各端末に.NET Frameworkのインストールも必要です。
一応、regasm不要な記述方法もありますが、そもそもの問題として、Webブラウザー上でCOMを実行したいのかどうか? そこを検討してください。
-
ご回答ありがとうございます。
現行の機能:ASP+COM(CAB):ブラウザ上に自作のCOMコントロールを表示 を
ASP+アセンブリで、作り変えるのが目的です。
イメージ的にはブラウザ上に
(http://www.atmarkit.co.jp/fdotnet/dotnettips/575aspajaxcalendar/aspajaxcalendar.html)のようなアセンブリのコントロールを表示しなければなりません。
ASP上に表示されるものは、COMでなくてもいいのですが、アセンブリのコントロールを表示させたいです。
すいません。質問の返答になっているでしょうか? -
# 今どきのトレンドは、JavaScriptを使ってHTML・画像その他を記述する方向ですが…あくまで.NETアセンブリを希望という点を踏まえて
Internet Explorer を使用したランタイム アプリケーションの配置というドキュメントがあります。regasmせずとも、classid="dllファイル名#クラス名"でInternet Explorer上に描画することができます。
ただしこの機能は.NET 4で廃止されたような気がしています。気がするだけで、ググってもそれに関する記述は見つけられませんでしたが。 -
ただしこの機能は.NET 4で廃止されたような気がしています。気がするだけで、ググってもそれに関する記述は見つけられませんでしたが。
「ie hosted assembly .net framework 4」で検索し、「Full Trust in .Net 4 Component Hosted in IE」を見つけました。この中にマイクロソフト社員さんから『Yes, Jaewoo is correct: IEHost.dll is not part of VS2010 RTM \ 4.0 FW.』と返答があります。
Jitta@わんくま同盟