• 締切済み

VC++からのocxの使用方法

画面のないVC++(.NETではない)でocxを使用したいのですが、うまくいきません。 以下のようなソースを作成したのですが、デバイスのオープンで例外が発生します。 #import "C:\\xxx\\OposXXXXX.ocx" no_namespace named_guids rename("Release","ReleaseOposPenScanner") int main(int argc, char* argv[]) { HRESULT hResult; _DOposXXXXCO* device; _bstr_t deviceName("XXX"); ::CoInitialize(NULL); hResult = ::CoCreateInstance((REFCLSID)CLSID_OposXXXCO, 0, CLSCTX_INPROC_SERVER, (REFIID)DIID__DOposXXXXCO, (LPVOID*)&device; try{ device->Open(deviceName); }catch(_com_error &e){ return 0; } … Open()時に例外が発生します。 デバッグ出力したところ、 e.ErrorMessage() = 00169E68 e.Error() = -2147418113 e.ErrorInfo() = 00000000 とでましたが、ネットでも情報が見つけられませんでした。 解決策をご存知の方、よろしくお願いします。

みんなの回答

  • gentoo314
  • ベストアンサー率41% (15/36)
回答No.1

インスタンスの生成は成功しているんですね。 そのクラスのOpen関数の仕様を見るしかないと思いますが。 Open()の前に何かをコールしておく必要があるのか、引数を間違っているのか。

関連するQ&A

  • DirectPlay8Peer の初期化ができません

    はじめまして。 すみません。大変困ってます。助けてください。 DirectPlay8の初期化をするのに HRESULT hr; hr = CoCreateInstance( CLSID_DirectPlay8Peer, NULL, CLSCTX_INPROC_SERVER,IID_IDirectPlay8Peer, (LPVOID*) &g_pDP ); hr = g_pDP->Initialize( NULL, DirectPlayMessageHandler, 0 ); だけではできないのですが、どうしたらいいですか? ヘッダーファイルが足りないだけでしょうか。 ヘッダーは Dplay8.h Wtypes.h Objbase.h を使用しています。 COMオブジェクトの使用方法が間違っているのかもしれません。 (COMをあまり理解していないため・・・) DirectXのサンプルをみても全く理解できずに苦しんでいます。 すみません。お願いします。

  • C# COM DELL へコールバックを設定したい

    MFCとC# COM DELLのプログラムを行ってます。 今回、MFCからC#COM DLLへコールバック関数を設定して C# COM DLLからそのコールバックを呼び出したいですが、どうしてもうまくいきません。 コードを記述します。どうか助けてください。 ------------------------------------------------------------------ MFC C++ delegate bool CallBack(int hwnd, int lParam); class CMyDlg : public CDialog { Init() { cpi = NULL; CoInitialize(NULL); HRESULT hr = CoCreateInstance(CLSID_InterfaceImplementation, NULL, CLSCTX_INPROC_SERVER, IID_IManagedInterface, (LPVOID*)&cpi); retval = 0; if (FAILED(hr)) { printf("Couldn't create the instance!... 0x%x\n", hr); } else { CallBack^ myCallBack = gcnew CallBack(&Report); cpi->SetCallback( myCallBack ); } } static bool Report(int hwnd, int lParam) { return true; } } ; ------------------------------------------------------------------ C# COM DLL namespace DLL_COM_TEST { public delegate bool CallBack(int hwnd, int lParam); public interface IDLL_COM_TESTInterface { void Execute(); void SetCallback(CallBack funcCB); } public class IDLL_COM_TESTImplementation: IDLL_COM_TESTInterface { CallBack funcCB_E; public void SetCallback(CallBack funcCB) { funcCB_E = funcCB; } public void Execute() { funcCB_E(1111, 1); } } ------------------------------------------------------------------ エラー内容 error C3756: 'CallBack': デリゲートの定義が既存のシンボルと競合します。 'CallBack' の宣言を確認してください。 'myCallBack' : 定義されていない識別子です。 error C2061: 構文エラー: 識別子'CallBack' error C2065: 'myCallBack' : 定義されていない識別子です。

  • Direct Show(x64)でのエラー

    お世話になります。 現在x64版のDirect Showを利用して、aviファイルから任意のフレーム画像を取得する プログラムを作成しております。 Direct Showは今まで使ったことが無かったのですが、ネットにあるサンプルなどを 参考に手探りで作業を進めております。最終的にはx64版を作る必要があるのですが、 メインで作業しているPCが32bit環境であるため、とりあえずx86版で作業を進め、 なんとか期待する動作をするものが出来ました。 最終的に処理する動画ファイルは1440x810のものと、3840x2160の2つがあり、 x86版ではどちらも期待する動作をしてくれるのですが、x64にてコンパイルし64bit環境で 動作させると1440x810の方は問題ないのですが、3840x2160の方はうまく動作しません。 なお、プログラムは以下のような流れでDirectShowを利用しております。 CoInitialize CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, &pIGB); pIGB->QueryInterface( IID_IMediaControl, &pIMC ); pIGB->QueryInterface( IID_IID_IMediaSeeking, &pIMS ); CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, &pIBF ); pIBF->QueryInterface( IID_ISampleGrabber, &pISG ); pIGB->AddFilter( pIBF, NULL ); pISG->SetMediaType(&stMT); // stMTはMEDIATYPE_Video,MEDIASUBTYPE_RGB24,FORMAT_VideoInfoを設定 pIGB->RenderFile( ファイル名, NULL ); : 調べてみると、RenderFileのところでx64の場合はVFW_E_NO_TRANSPORTが帰ってきているようです。なお、その64bit環境でx86コンパイルしたものを動かすと問題なく動作します。 なお、もともとDirect X SDK 9.0を使っていましたが、念のため最新版のものをダウンロードして 試してみましたが、症状は変わりませんでした。また、Videoドライバも変えてみましたが、同様に 変化なしです。 どんな原因が考えられるか、どなたかご助言頂ければ助かります。 なお、開発環境・動作環境は以下の通りです。 Windows 7 Pro 64bit版 VisualStudio 2010 Pro Direct X SDK 9.0 or Direct X Jun_2010 C++ (純粋なネィティブプログラム)

  • Windowsタスクバーにツールバーを作成(3)

    前回、以下サイトを紹介いただき、何とかデスクバンドを作成することができました。 http://eternalwindows.jp/shell/shellex/shellex13.html http://msdn.microsoft.com/en-us/library/aa969320.aspx 現在、他アプリから、デスクバンドの登録と解除を行っていますが、デスクバンドの表示と非表示を同様に他アプリから、行いたいと考えております。 上記参考URLでは以下のように記載されていたのですが、当方の環境(WIndows XP / Borland C++Builder 6 pro)では以下コードはそのまま使えません。 どなたか、ご教授をお願いします。 <参考コード、Vista以降です> CLSID clsid = {0x112143a6, 0x62c1, 0x4478, {0x9e, 0x8f, 0x87, 0x26, 0x99, 0x25, 0x5e, 0x2e}}; HRESULT hr; ITrayDeskBand *pTrayDeskBand; CoInitialize(NULL); hr = CoCreateInstance(CLSID_TrayDeskBand, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pTrayDeskBand)); if (FAILED(hr)) { CoUninitialize(); } pTrayDeskBand->ShowDeskBand(clsid); pTrayDeskBand->Release(); CoUninitialize();

  • directshow を使用して、mpegファイルを再生するには

    お世話になっております。 directshowを使用して、mpegファイルを再生させようとおもったのです、以下のエラーが発生して、コンパイル出来ません。 c:\Documents and Settings\User\My Documents\Visual Studio Projects\test1\test1Class.cpp(33): fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 何が原因かさっぱり分かりません。 何方かご教授お願い致します。 開発環境は、visualstudio2003(言語C++.net) です。 ソースも載せておきます。よろしくお願い致します。 #include <dshow.h> void main(void) { IGraphBuilder *pGraph; IMediaControl *pMediaControl; IMediaEvent *pEvent; CoInitialize(NULL); // フィルタグラフマネージャを作成し、インターフェイスをクエリする。 CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph); pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl); pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent); // グラフを作成。重要: 使用システムのファイル文字列に変更すること。 pGraph->RenderFile(L"C:\\Hello_World.avi", NULL); // グラフの実行。 pMediaControl->Run(); // 終了を待つ。 long evCode; pEvent->WaitForCompletion(INFINITE, &evCode); // クリーン アップ。 pMediaControl->Release(); pEvent->Release(); pGraph->Release(); CoUninitialize(); }

  • 自作DirectShow Filterのinterface定義

    DirectShow Filterを自作しGraphEdit上で動作することを確認しました。 しかしC++プログラム上から独自定義のメソッドを呼び出すと 呼び出し元と先で呼び出し規約が異なるというエラーが出てしまいます。 定義は DEFINE_GUID(CLSID_MyClass, <<適当なGUID1>>); DEFINE_GUID(IID_IMyClass, <<適当なGUID2>>); MIDL_INTERFACE("<<適当なGUID2>>") IMyClass : public IUnknown {  STDMETHOD(myMethod)(void) PURE; }; class CMyClass : public CTransInPlaceFilter {  CMyClass ::CMyClass (IUnknown * pOuter, HRESULT * phr, BOOL ModifiesData);  CMyClass ::~CMyClass (); public:  static CUnknown *WINAPI CMyClass::CreateInstance(LPUNKNOWN punk, HRESULT *phr);  DECLARE_IUNKNOWN;  STDMETHODIMP CMyClass::myMethod(void){return S_OK;}; } 呼び出し元では DEFINE_GUID(CLSID_MyClass, <<適当なGUID1>>); DEFINE_GUID(IID_IMyClass, <<適当なGUID2>>); MIDL_INTERFACE("<<適当なGUID2>>") IMyClass : public IUnknown {  STDMETHOD(myMethod)(void) PURE; }; int main() {  CoInitialize(NULL);  IMyClass pMyClass;  CoCreateInstance(   CLSID_MyClass,   NULL,   CLSCTX_INPROC,   IID_IMyClass,   (LPVOID *)&pMyClass  );  pMyClass->myMethod();←ここでエラー  ・  ・  (略)  ・  ・ } エラーメッセージは Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention. です。 どちらも__stdcallになってるはずなんですが… 原因が分かる方おられましたらよろしくお願いいたします。

  • directshowでAVIファイルが再生が出来ません…

    Directshowを用いて動画を再生しようと試みています。 Direct sdkとplarformの両方を入れて、インクルードパスとライブラリパスを通しました。 ビルドしてもエラーは無いので某所のシンプルなソースでデバッグ無しで開始をクリック。 すると、再生が終わらないようにメッセージBlock Executionが表示されるものの肝心の動画が映りません。 プログラムはしっかりと動いているはずですが、、 動画aviはMSMPEG4V2です。Directshowのコーデックで動くとのことです。何がおかしいのか、さっぱりです。 環境はwindowsXP visual studio2005 DirectxSDK2008 microsoft platform(しっかりDirectshowフォルダは存在します) ここまで来たなら設定ミスは無いとは思いますが、(設定ミスがあれば、開けない等エラーが出ると思いますので) どうかお願い致します。 サンプルソース ↓ #include <stdio.h> #include <dshow.h> #define FILENAME L"C:\\Documents and Settings\\057104\\My Documents\\homerun2.avi" int main() { IGraphBuilder *pGraphBuilder; IMediaControl *pMediaControl; // COMを初期化 CoInitialize(NULL); // FilterGraphを生成 CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (LPVOID *)&pGraphBuilder); // MediaControlインターフェース取得 pGraphBuilder->QueryInterface(IID_IMediaControl, (LPVOID *)&pMediaControl); // Graphを生成 pMediaControl->RenderFile(FILENAME); // 再生開始 pMediaControl->Run(); // 再生中にプログラムが終わってしまわないように MessageBox(NULL, "Block Execution", "Block", MB_OK); // 資源を解放 pMediaControl->Release(); pGraphBuilder->Release(); // COM終了 CoUninitialize(); return 0; }

  • ハンドルされていない例外は・・・

    ハンドルされていない例外はXXX.exe(YYY.DLL)にあります 0xC0000005:Access Violationというエラーが出ます。 エラーが出ている場所は int nRet = oraDyna.Open(*ZZZ, Sql); です。 ここを通過する時にエラーが発生します。 エラーの原因として何が考えられるでしょうか? 開発環境はWindows2000 VC++6.0です。 よろしくお願いします。

  • C#でWin32 MFC DLLが呼び出せない

    C#で以下のエラーが発生し、非常に困ってます。 色々とサイトを見たのですが、DLLが本当にないのでは?という意見が多かったです。 しかし、私の方はDLLファイルはbin->debugフォルダ , obj->debugフォルダ、System32に置いてます。 問題が分かる方、是非教えてください! using System.Runtime.InteropServices; namespace WindowsFormsApplication { public partial class Form1 : Form { [DllImport("Win32DLL_TEST.dll")] private extern static int func(int x, int y); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int n = func3(5, 7);//ここでエラー! } } } エラー内容 'System.DllNotFoundException' のハンドルされていない例外が WindowsFormsApplication.exe で発生しました。 追加情報: DLL 'Win32DLL_TEST.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E) 備考 DLLは自作のWin32 DLL です。 extern "C"{ __declspec(dllexport) int __cdecl func(int x, int y) } と宣言し、VC++のMFC dialog上では呼び出しを成功しています。

  • C++6.0における動画再生プログラムについて

    動画再生プログラムを作成したのですが、実行するとファイルから選択して動画を再生という形になっています。 ここでやりたいこととしては、実行するとプログラム内で指定したファイルがすぐ再生できるようなプログラムに改良したいと思っています。 どこを改良したらよいかわからないので、どなたか教えていただけませんでしょうか?以下が作成したプログラムです。 #include <windows.h> #include <string.h> #include <dshow.h> //DirectShowのさまざまな準備 #include <conio.h> //getch()用 #include <stdio.h>//インターフェース用のポインタ IGraphBuilder * pigb = NULL; IMediaControl * pimc = NULL; void main (){ OPENFILENAME fname; static char fn [256]; memset ( &fname, 0, sizeof (OPENFILENAME) ) ; fname.lStructSize = sizeof (OPENFILENAME) ; fname.lpstrFile = fn; fname.nMaxFile = sizeof (fn) ; fname.Flags= OFN_FILEMUSTEXIST |OFN_HIDEREADONLY; if ( !GetOpenFileName ( &fname ) ) return ; WCHAR filename [MAX_PATH] ; HRESULT hr; CoInitialize (NULL) ;//ファイル名の変換 MultiByteToWideChar ( CP_ACP, 0, fn, -1, filename, MAX_PATH ) ; //FilterGraphの初期化,GraphBuilderインターフェースを得る hr = CoCreateInstance ( CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**) &pigb) ; if (SUCCEEDED (hr) ){//MediaControlインターフェースを得る pigb -> QueryInterface ( IID_IMediaControl, (void**) &pimc ) ; //再生するファイルを指定 hr = pigb -> RenderFile ( filename, NULL ) ; if (SUCCEEDED ( hr ) ){//再生 pimc -> Run () ; printf ("\n 再生中です、再生終了後どれかキーを押してください.") ; getch() ; } } //FilterGraphの開放 if ( pigb )pigb -> Release () ; if ( pimc )pimc -> Release () ; CoUninitialize () ; return ; }