• 締切済み

種類が一致しません。 (HRESULT からの例外

VB.NET(2.0)からActiveXコントロールを使用しています。 あるメソッドを使おうとすると、 'System.Runtime.InteropServices.COMException' の初回例外が mscorlib.dll で発生しました。 とイミディエイトウィンドウに出て、 COMException はハンドルされませんでした。 種類が一致しません。 (HRESULT からの例外: 0x80020005 (DISP_E_TYPEMISMATCH)) という例外ヘルパのメッセージが出てきます。 試しに、そのActiveXコントロールを埋め込んだHTMLを作り、VBScript で同メソッドを同条件で使うと、正しく処理をしてくれるので、メソッド内で例外が発生するような事はないのは確認済みです。 http://msdn.microsoft.com/ja-jp/library/af1y26ew(VS.90).aspx を読んで、ErrorCode が "-2147352571" になっている事を確認しましたが、それ以上解決策を見つける事が出来ませんでした。そもそも「種類が一致しません。」の意味が分かりません。何の種類なんでしょうか。 どなたかお力添え頂ければ幸いです。

みんなの回答

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

「DISP_E_TYPEMISMATCH」で検索したら引数の型っぽいけど? http://support.microsoft.com/kb/175617/ja > ActiveXコントロール > VBScript VB6 準拠じゃないの?VB.NET では型の定義が一新されたけど、 正しく使ってるの? http://msdn.microsoft.com/ja-jp/library/dd297710.aspx http://msdn.microsoft.com/ja-jp/library/dd297706.aspx http://msdn.microsoft.com/ja-jp/library/dd297724.aspx http://msdn.microsoft.com/ja-jp/library/dd297698.aspx そもそもそのActiveXはVB.NETに対応してるの? http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46266&forum=7

sumire_kanou
質問者

補足

ありがとうございます。 > 「DISP_E_TYPEMISMATCH」で検索したら引数の型っぽいけど? そのページも既読ですが、DISPARAM structure の意味が分かりません。 > VB6 準拠じゃないの?VB.NET では型の定義が一新されたけど、正しく使ってるの? VB6 準拠と .NET 準拠の ActiveX コントロールが存在するんですね。 使用しているのはVS2008C++環境ビルドのhoge.ocxです。 AxImp.exe /source にて hoge.ocx から AxhogeLib.cs と hogeLib.dll を機械的に生成してます。 > そもそもそのActiveXはVB.NETに対応してるの? 他に160個ほどメソッドを出してますが、他のは動いている、という奇妙な状況なんです。 もちろん、型は気をつけるとして、他にどんな事をすれば MARU4812 さんのおっしゃる「VB.NET に対応」できるのでしょうか。 ocx では 宣言: BSTR method(short x, LPCTSTR str); ディスパッチマップ: DISP_FUNCTION_ID(Choge, "method", dispidmethod, method, VT_BSTR, VTS_I2 VTS_BSTR) [id(163), helpstring("メソッド method")] BSTR method(short x, BSTR str); といった具合で宣言しており ラッパとなる AxhogeLib.cs では、method は public virtual string method(short x, string str) { if ((this.ocx == null)) { throw new System.Windows.Forms.AxHost.InvalidActiveXStateException("method", System.Windows.Forms.AxHost.ActiveXInvokeKind.MethodInvoke); } string returnValue = ((string)(this.ocx.method(x, str))); return returnValue; } としてラッピングされてます。 VB側から実際に叩くのは、AxhogeLib.cs をビルドした AxhogeLib.dll です。 methodの仮引数を入れ替えたりしましたが「種類が一致しません」のエラー、仮引数を試しにvoidにすると「パラメータはオプションではありません」のエラーです。

関連するQ&A

  • C++/CLIからC++の呼び出しで例外

    お世話になります。 C#からC++のNativeコード(unmanaged)を呼び出したいと思い、C++/CLIでラッパーを作りました。 そのラッパーのクラス内で、C++で書かれたNativeコードのクラスのインスタンスを作成する時に例外が発生してしまいます。 例外はこんな感じです。 System.Runtime.InteropServices.SEHException はハンドルされませんでした。 Message="外部コンポーネントが例外をスローしました。" Source="ManMovLib" ErrorCode=-2147467259(0x80004005) StackTrace: 場所 new(UInt32 ) C++/CLIは以下の様なコードで、コンストラクタ内でC++のクラスの実体を作っています。そして、このnewで例外が発生します。 AVSource::AVSource(void) {   m_pObj = new CAVSource; } C++側は、実は何もしていません。 CAVSource::CAVSource(void) { } そして、色々と試行錯誤をした結果、C++側のクラスにvirtual関数があると、例外が出てしまうという事実を突き止めました。 ただ、どこを調べても、virtual関数を用いてはいけないとは書いてありません。 実際、virtualを使ってはいけないという制約があるのでしょうか? また、何かNativeのコードを作成する際に注意点とかありますでしょうか? ちなみに、プロジェクトの設定で、Nativeコードのデバッグを可能にするチェックをつけてデバッグ実行すると、何故かこの例外は発生せずに、全て正常に動きます。これもなぞです。 よろしくお願いします。

  • 「アプリケーションを起動」できません!

    あるアプリケーション(具体的にはcTraderという、FXで使うプラットフォームです)を開こうとすると、添付した画像のようにエラーが出ます。 どうすればアプリを起動できますか?PCはWindows10です。 参考までに、画像の「詳細D」を開いた時に表示されていた文言を一部だけ載せます。 エラーの概要 以下はエラーの概要です。これらのエラーの詳細はログに一覧表示されています。 * http://tradeviewmarkets.ctrader.com/xTrader.application のライセンス認証により例外が発生しました。 次の失敗メッセージが検出されました: + アプリケーションの結合データ形式が無効です。 (HRESULT からの例外:0x800736B2) コンポーネント ストア トランザクションの失敗の概要 トランザクション エラーは検出されませんでした。 エラーの詳細 この操作中に次のエラーが検出されました。 * [2018/11/06 21:55:27] System.Runtime.InteropServices.COMException - アプリケーションの結合データ形式が無効です。 (HRESULT からの例外:0x800736B2) - ソース:System.Deployment

  • C# 例外が発生しないことの保障

    Javaと比較して書きます。 Javaで記述した場合: public class JavaClass {  public static SampleClass s = new SampleClass(); } C#で記述した場合: public class CSharpClass {  public static SampleClass s = new SampleClass(); } JavaでもC#でも、同じコードを記述しているように見えますが、Javaではnew SampleClass()コンストラクタで例外が発生しない事が分かっているのに対して、C#の場合では例外が発生しないとは言い切れません。 これは、Javaでは、例外をスローする可能性のあるメソッド宣言では、その全てについてthrows宣言をしなければいけないのに対して、C#にはこの制約が存在しないことが原因です。 これについて何が困るかといいますと、C#で、static宣言な変数や静的コンストラクタで安易にメソッド呼び出し等を行うと、キャッチできなくなってしまいます。 public class Exceptionner {  public Exceptionner()  {   throw new ApplicationException("Exceptionnerクラスの例外");  } } public class SampleClass {  public static Exceptionner e = new Exceptionner(); // ここで例外が発生するが、キャッチできない。 } public class MyEntryPoint {  public static void Main()  {   try   {    SampleClass s = new SampleClass();   }   catch (Exception e)   {    // System.ApplicationExceptionでなくSystem.TypeInitializationExceptionとなる。    // つまり、元の例外の情報は失われている    Console.WriteLine(e.GetType());   }  } } これを現在漠然と問題視していますが、何かよい解決策はありませんでしょうか。 望んでいる解決策: ・C#でもメソッドが例外を返さないという保障がソースレベルでメソッドやコンストラクタに宣言可能? ・C#では例外をちゃんとキャッチしなくてもスマートに記述することが可能? ・問題視する必要がない?(whyも含めて)

  • vb プログラムの起動と例外処理

    はじめまして プログラムの実行と例外処理に関して質問させていただきます。 現在,visual basic2005でプログラム(A)からvbで作成した別のプログラム(B)に引数を指定してから起動し,別のプログラム(B)が例外処理に関する方法を調べています。 プログラム(B)起動時に例外処理を用い,以下のようなエラーメッセージを表示させるにはどういった処理を構成すればよいでしょうか。 パス名が設定されていない場合,”ファイルのパス名が見つかりませんでした” 引数が指定されていない場合,”引数が指定されておりません” 原因が特定できないエラーが発生した場合,”原因不明のエラーが発生しました” プログラムの実行にはShellメソッドとSystem.Diagnostics.ProcessクラスのStartメソッドがあるという事がわかりましたが,上記2つのメソッドが自分の意図したい操作に適しているかまでは理解におよんでおりません。 まだプログラミングを始めたばかりという事もあり,右も左もわかりませんが,ご教授お願い致します。

  • フリーソフトでエラーが出て困っています。JITデバック?

    フリーソフトでエラーが出て困っています。JITデバック? 「楽天watcer」というソフトを使おうと思っているのですが、 2度目の起動から以下のようなエラーが出てしまい、うまく起動できません。 『アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました[続行]をクリックすると、アプリケーションはこのエラーを無視し、続行しようとします。[終了]をクリックすると直ちに終了します。』 『CLSID {0002DF01-0000-0000-C000-000000000046} を含む COM コンポーネントのインスタンスを IClassFactory から作成中に、次のエラーが発生しました: 80004005。』 また、詳細ボタンをクリックすると、例外テキスト、読み込まれたアセンブリ、JITデバックについてかかれた文章がでてきます。すべてかけなかったので一部だけ載せました。 ************** 例外テキスト ************** System.Runtime.InteropServices.COMException (0x80004005): CLSID {0002DF01-0000-0000-C000-000000000046} を含む COM コンポーネントのインスタンスを IClassFactory から作成中に、次のエラーが発生しました: 80004005。 場所 SKClass.IEClient..ctor() 場所 RakutenWatcher.LoginTestClient..ctor(FormMain form) : ************** 読み込まれたアセンブリ ************** mscorlib アセンブリ バージョン: 2.0.0.0 Win32 バージョン: 2.0.50727.4927 (NetFXspW7.050727-4900) コードベース: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll : ************** JIT デバッグ ************** Just-In-Time (JIT) デバッグを有効にするには、このアプリケーション、 またはコンピュータ (machine.config) の構成ファイルの jitDebugging 値を system.windows.forms セクションで設定しなければなりません。 アプリケーションはまた、デバッグを有効にしてコンパイルされなければ なりません。 例: <configuration> <system.windows.forms jitDebugging="true" /> </configuration> JIT デバッグが有効なときは、このダイアログ ボックスで処理するよりも、 ハンドルされていない例外はすべてコンピュータに登録された JIT デバッガに設定されなければなりません。 起動のためのファイルも「.application」とみたことのないもので、何か設定などしないといけないのでしょか? ちなみに、OSはwindows7です。 長々とすみませんでした。パソコン初心者なもので、プログラミングとかはさっぱり分からないので何をしたらいいのか・・・。 どのようなことをしたらいいのかを、具体的にできるだけわかりやすく教えてください。 それでは、ご回答よろしくお願いします。

  • printStackTrace()メソッドに関する疑問

    お世話になります。 Javaの例外処理等で使用されるprintStackTrace()メソッドに関する疑問なのですが・・・。 AppletやServletのプログラム内の例外処理で使用されるprintStackTrace()メソッドは通常例外が発生すると、ログ等に例外メッセージが表示されますが、printStackTrace()メソッドで取得した例外メッセージをHTMLで画面表示させる事は(エラーメッセージや例外メッセージが発生した時にそのメッセージをHTMLで画面表示させる様にするという処理を行う場合)出来るのでしょうか? getMessage()メソッドでは上手くメッセージを取得して変数に格納し、HTMLでメッセージを画面表示させるようには出来るのですが、printStackTrace()メソッドでは上手く出来ません。 ご存知の方がいらっしゃいましたら、是非ご教授お願い致します。

    • ベストアンサー
    • Java
  • VB6のユーザーコントロールの受け渡しでプロパティ

    自作のユーザーコントロールをフォームに貼り付け、 それをクラスに渡してクラス内でそのコントロールのVisibleを制御しようとしておりますが、 フォームからコントロールのVisibleプロパティにアクセスできますが、 クラスからだと、 メソッドまたはデータメンバが見つかりません とコンパイルエラーが出ます。 そこで、コントロールをControlやUserControlにキャストしてみましたが 型が一致しません というエラーとなってしまいます。 コントロールにVisibleプロパティの追加を試みましたが、 ActiveXコントロールインタフェースウィザードの使用できる名前に於いて それらのプロパティが列挙されません。 対象がユーザーコントロールでなく、ボタンなどの標準コントロールの場合は できたのですが・・・ なにか方法をご存知でしたらご教授ください。

  • ActiveX コントロールの使用個数の確認

    教えて下さい。 各コントロール配列がフォーム上ですと、[コントロール名.UBound]メソッドで最大要素数が確認できますよね。 (もしくは、Indexプロパティで要素Noを見れる。) それと同じ事をAcitiveXコントロール内で自コントロールが有るフォームで何個使用されているか知りたいのですが、何か方法はありませんか? 例を上げます。  ActiveXコントロール名称:Test フォーム名称:frmMain このフォームにTest(0),Test(1),Test(2)を3個使用した場合、   (もしくは、Test1,Test2,Test3と3個使用した場合) ActiveXコントロール内で何個使用されているかを知りたい。 と言うわけですが。。。

  • HRESULTからの例外:0x8007000B

    恐らく64bitに対応していないソフトウェアの32bitでの起動について MCAS勉強の為、FOM出版の「Word2007公認テキスト&問題集」を購入、付属のCD-ROMをインストールしました。CD-ROMには規定でマイドキュメントに保存されるWordの問題(Wordでそのまま開く)と、フルサイズで再生される、5回の模擬問題が入ったアプリケーションが入っていますが、この模擬問題が、下文の様なエラーが出て、灰色の起動画面だけが出て、再生できません。 模擬試験プログラムの再生環境はWindows Visa(32bit) 又はXP SP2(32bit) のいずれか一つで、Office 2007 (SP1)なのに対し、現在私が使っているOSはWindows 7 Home Premium の64bit版、Officeは2007 (SP2 ・Personal)です。 ・OfficeはSP2なのは気になりますが、それ以外はは完全インストール済みで問題ないと思うので、問題はOSが64bit版で対応外な事だと思うのですが、私のPC(vaio 型番:VGN-NW51FB/N)は32bitへの切り替えもできません。 ・CD-ROM自体は問題なく、XP使用のパソコン教室では問題なく再生されます。 PCやプログラムにはあまり詳しくありませんが、以下のエラーから察するに、 『(machine.config) の構成ファイルの jitDebugging 値を system.windows.forms セクションで設定し、アプリケーションのデバッグを有効化してコンパイルする』 とやらを何とかすればできそうな気がするのですが・・・ できる限りGoogleで調べたましたが分からず、↑を素人が行うのは別のエラーが発生する可能性もあり、リスクもあるのは分かりますが、取扱説明書やトラブルシューティングを読んで自力で回復できることは何とか出来てきてきたので、何とか自分でできるものならこの(64bitの)OS上で上手く起動させたいです。 何とかならないでしょうか・・・ ------------------------------------------------------------------ アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました間違ったフォーマットのプログラムを読み込もうとしました。(HRESULTからの例外:0x8007000B Just-In-Time (JIT) デバッグを呼び出すための詳細については、 ダイアログ ボックスではなく、このメッセージの最後を参照してください。 ************** 例外テキスト ************** System.BadImageFormatException: 間違ったフォーマットのプログラムを読み込もうとしました。 (HRESULT からの例外: 0x8007000B) ~中略~ ************** 読み込まれたアセンブリ ************** ~中略~ ************** JIT デバッグ ************** Just-In-Time (JIT) デバッグを有効にするには、このアプリケーション、 またはコンピュータ (machine.config) の構成ファイルの jitDebugging 値を system.windows.forms セクションで設定しなければなりません。 アプリケーションはまた、デバッグを有効にしてコンパイルされなければ なりません。 例: <configuration> <system.windows.forms jitDebugging="true" /> </configuration> JIT デバッグが有効なときは、このダイアログ ボックスで処理するよりも、 ハンドルされていない例外はすべてコンピュータに登録された JIT デバッガに設定されなければなりません。

  • c# Moveイベなしで子コントロールの移動を感知

     こんにちは。c#初心者です。  今までは子コントロールが移動した事を知るためにはMoveイベントを使ってきたのです。が、ちょっと気になって、OnMoveメソッドを(空のメソッドで)オーバーライドしてMoveイベントを発生させないコントロールを作ってTableLayoutPanelで普通のButtonコントロールと比較実験してみました。  すると、普通のButtonではLeft += 10;とすると、ひとまず左にずれ、イベントが発生し、そこからTableLayoutPanelに戻されて、再びイベントが発生する、という流れでした(もうこの時点でイベントが2回しか発生していないので、次を見なくても分かるのですが)。  その後、Moveイベントを発生させないコントロールで同様にLeft += 10;とすると、無論イベントは発生しませんでしたが、確かに左へ10動いた後、右へ10動きました。  Resizeも同様に比較しましたが、同様の結果が得られました。  何が言いたいかのと言うと、どうやらTableLayoutPanelはMoveイベント(Resizeイベント)を使わずに子コントロールの移動/サイズ変更を感知しているようで、この真似をしたいのですが、どうすればよいのでしょうか?  OnMove(OnResize)メソッドの後に呼び出され、親コントロールに移動/サイズ変更を伝えるメソッドがControlクラスにあると思ったのですが、それも見当たりません。  どなたか、分かる方、いらっしゃいましたら教えていただけませんか?

専門家に質問してみよう