C++でWindowsAPIを使用する際のエラー対処方法

このQ&Aのポイント
  • C++でWindowsAPIを使用する際に発生するエラーコードと、その解決方法について解説します。
  • WindowsAPIを使用する際にエラーが発生し、エラーコード「C2787」が表示される場合の対処方法を紹介します。
  • C++でWindowsAPIを使いたい場合に発生する可能性のあるエラー「C2787」の解決方法を説明します。
回答を見る
  • ベストアンサー

C++ でWindowsAPIを使用する際

WindowsAPIを使用しようとしているのですが、エラーが出てうまくいきません。 もし原因が分かる方がいらっしゃれば、教えていただけると幸いです。 エラーコード: error C2787:: IFileOperation :このオブジェクトに関連付けられたGUIDがありません。 問題箇所: HRESULT CopyItem(__in PCWSTR pszSrcItem, __in PCWSTR pszDest, PCWSTR pszNewName) { // // Initialize COM as STA. // HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); if (SUCCEEDED(hr)) { IFileOperation *pfo; // // Create the IFileOperation interface // hr = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pfo));  //※ここでエラー発生  if (SUCCEEDED(hr)) { // // Set the operation flags. Turn off all UI from being shown to the // user during the operation. This includes error, confirmation, // and progress dialogs. // hr = pfo->SetOperationFlags(FOF_NO_UI); if (SUCCEEDED(hr)) { // // Create an IShellItem from the supplied source path. // IShellItem *psiFrom = NULL; hr = SHCreateItemFromParsingName(pszSrcItem, NULL, IID_PPV_ARGS(&psiFrom)); if (SUCCEEDED(hr)) { IShellItem *psiTo = NULL; if (NULL != pszDest) { // // Create an IShellItem from the supplied // destination path. // hr = SHCreateItemFromParsingName(pszDest, NULL, IID_PPV_ARGS(&psiTo)); } if (SUCCEEDED(hr)) { // // Add the operation // hr = pfo->CopyItem(psiFrom, psiTo, pszNewName, NULL); if (NULL != psiTo) { psiTo->Release(); } } psiFrom->Release(); } if (SUCCEEDED(hr)) { // // Perform the operation to copy the file. // hr = pfo->PerformOperations(); } } // // Release the IFileOperation interface. // pfo->Release(); } CoUninitialize(); } return hr; よろしくお願いします。

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

  • ベストアンサー
回答No.1

APIがどういう仕様か知りませんが、 普通にCの観点でおかしい箇所はあります。 > IFileOperation *pfo; ポインタで宣言して、 > IID_PPV_ARGS(&pfo));  //※ここでエラー発生  さらにそのアドレスを参照している。 *pfoには実体はありません。 実体の無い変数にたいしてさらにアドレス参照しているのだから、 なにかおかしな記述ですね。 GUIDは、予めどこかで生成したFileオブジェクトのIDを指定するのでしょう。 pfoの内部にIDを入れる箇所があるのでは、と思います。

kurohune12
質問者

お礼

回答ありがとうございます。 ご教授いただいた点を考慮して修正を行ったところ、上手くいきました。 また機会があればよろしくお願いします。

関連するQ&A

  • BHO-3

    いつもお世話になっています。 STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite) { HRESULT hr = S_OK; if (m_pSite != NULL){ m_pSite->Release(); m_pSite = NULL; } if (pUnkSite != NULL) { IHTMLDocument3 *pDocument3; HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); if (SUCCEEDED(hr2)){ PutEventHandler(pDocument3); } ////////////////////////////// // IWebBrowser2 へのポインタをキャッシュします。 HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser); if (SUCCEEDED(hr)) { // DWebBrowserEvents2 からのイベントをシンクに登録します。 hr = DispEventAdvise(m_spWebBrowser); if (SUCCEEDED(hr)) { m_fAdvised = TRUE; } } 上のコードの IHTMLDocument3 *pDocument3; HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); if (SUCCEEDED(hr2)){ PutEventHandler(pDocument3); } ですが、 HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); の部分で失敗します。 HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser); if (SUCCEEDED(hr)) { // DWebBrowserEvents2 からのイベントをシンクに登録します。 hr = DispEventAdvise(m_spWebBrowser); if (SUCCEEDED(hr)) { m_fAdvised = TRUE; } } が、上手く動くのでまねをしたのですが上手く行きません。 すみませんが、アドバイスお願いします。

  • 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 ; }

  • 描画について

    サイズを綺麗に描画したいのですが(サイズの範囲(rightとbottom)が微妙にずれている)どうしたら描画できるでしょうか? ここら辺かな?と思うところを載せます。 HRESULT ReadBMP(ID3DXSprite** g_pSprite,LPCTSTR lpszFilename,DDXTEX* g_pTexture) { HRESULT hr = S_FALSE; UINT uLevel = 0; IDirect3DSurface9* pSurface = NULL; lstrcpy(g_pTexture->m_Filename,lpszFilename); g_pTexture->m_clrAlpha=g_colorKey; g_pTexture->m_pTexture=NULL; // スプライト情報の生成 if (SUCCEEDED(hr)) hr = ::D3DXCreateSprite(g_pd3dDevice, g_pSprite); if (SUCCEEDED(hr)) hr = ::D3DXCreateTextureFromFileEx(g_pd3dDevice, g_pTexture->m_Filename, 680, 460, 1, D3DUSAGE_RENDERTARGET, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, g_pTexture->m_clrAlpha, NULL, NULL, &g_pTexture->m_pTexture); if (SUCCEEDED(hr)) hr = g_pTexture->m_pTexture->GetSurfaceLevel(uLevel, &pSurface); // サーフェイス取得 if (SUCCEEDED(hr)) hr = pSurface->GetDesc(&g_sSurfaceInfo); if (pSurface != NULL) pSurface->Release(); pSurface = NULL; // 失敗したら破棄 if (FAILED(hr)) DestroySplite(*g_pSprite,g_pTexture); return hr; } よろしくお願いします。

  • 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();

  • BHO のサンプルを拡張して、トラブル

    いつも、お世話になっています。 http://msdn.microsoft.com/ja-jp/library/bb250489(v=vs.85).aspx を参考にして、BHOのプログラムを始めてみました。 機能を追加しようとして、他のサイトを参考にして BOOL CHelloWorldBHO::PutElementData(IHTMLDocument3 *pDocument3) { BSTR bstrId, bstrHref, bstrText; IHTMLElement *pElement; IHTMLAnchorElement *pAnchorElement; bstrId = SysAllocString(L"sample"); pDocument3->getElementById(bstrId, &pElement); if (pElement == NULL) { SysFreeString(bstrId); return FALSE; } bstrText = SysAllocString(L"トップページへ戻ります"); pElement->put_innerText(bstrText); pElement->QueryInterface(IID_PPV_ARGS(&pAnchorElement)); bstrHref = SysAllocString(L"http://eternalwindows.jp/"); pAnchorElement->put_href(bstrHref); MessageBox(NULL, TEXT("エレメントのデータを変更しました。"), TEXT("OK"), MB_OK); SysFreeString(bstrText); SysFreeString(bstrHref); SysFreeString(bstrId); pAnchorElement->Release(); pElement->Release(); return TRUE; } を追加してみました。他にも3つの関数を追加しました。 コンパイルすると、 'IID_PPV_ARGS': 識別子が見つかりませんでした とのメッセージが出ます。 どのように対処すればよいのでしょうか? OSはWin7(64ビット) + VS2005 で作業しています。 よろしくご指導ください。

  • DirectInputについて

    C++でDirectinputの事なのですが。 デバッグには成功するのに、起動した後すぐ強制終了してしまいます。 VOID KeyCheck() { BYTE KeyState[256]; HRESULT hr; hr = g_lpDIDevice->GetDeviceState(256,KeyState); if (SUCCEEDED(hr)) { if (KeyState[DIK_LEFT]&0x80) muki=0; } else hr = g_lpDIDevice->Acquire(); } directxの勉強に簡単なものを書いてみようと思ったのですが、どの辺りがいけないのでしょうか?

  • XAudio2がNULLになってしまう

    はじめまして、DontacosM2と申します。 現在、DirectX を使用して ゲームアプリケーションの制作を行っています。 サウンド再生に XAudio2 を使用しているのですが、 実行ファイルを作成し、友人に渡したところサウンド部分が原因でアプリケーションが停止してしまい困っております。 以下、XAudio2 の初期化部分のソースコードです。 {    HRESULT hr;    unsigned int flag = 0;      //COMを初期化    CoInitializeEx(NULL, COINIT_MULTITHREADED);   #ifdef _DEBUG      // デバッグする時はフラグを立てるようにとの事    flag |= XAUDIO2_DEBUG_ENGINE;   #endif      hr = XAudio2Create(&g_pXaudio2, flag, XAUDIO2_DEFAULT_PROCESSOR);      if (SUCCEEDED(hr))    {       hr = g_pXaudio2->CreateMasteringVoice(&g_pMasteringVO, 0, 0, 0, 0, 0);       if(FAILED(hr))       {          //エラー処理       }    }    else    {       //エラー処理    }    return hr; } 自分のPCでコンパイルすると正常にクリエイトでき、サウンドも再生されるのですが、 友人のPCで、僕の作成したexeを実行すると XAudio2Create を行っているところで g_pXaudio2 がNULLになっているようで 以降、サウンドが鳴らない等の不具合が出ています。 DirectX SDK は August2009で、 Visual C++ 2008 Express を使用しています。 友人のPCにはSDKは入っておらず、ランタイムは今現在の最新のものです。 初期化部分に問題は無いと思うのですが・・・ 環境によって XAudio2Create が上手く動作しないという事があるのでしょうか? 宜しくお願いします。

  • 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のサンプルをみても全く理解できずに苦しんでいます。 すみません。お願いします。

  • DirectXを用いたActiveXを用いてVistaで情報が取れない

    ActiveXからDirectXを叩いてOSやCPUなどの情報を 取得しようとしています。 XPでは問題なく情報が取れますが、Vistaでは 情報が取れる項目と取れない項目があります。 この現象について、教えてください。 APIは正常に終了しています。 OS(szOSExLongEnglish) → 正常取得 ベンダー(szSystemManufacturerEnglish) → n/a 型番(szSystemModelEnglish) → n/a CPU(szProcessorEnglish) → (空白) 物理メモリ(szPhysicalMemoryEnglish)  → 正常取得 IEのデフォルトの設定では上記のような状態ですが、 設定を変えて保護モードを外すと正常動作し、 すべての情報が取得できます。 しかし、保護モードが有効の状態で、 情報取得したいです。 以下にコードを書きます。 ※このコードはあるサンプルソースをほとんどそのまま使っています。 //////////////////////////////////////////////////////////////////////////////// // 初期化 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::Init(void) { HRESULT hr; DXDIAG_INIT_PARAMS dxDiagInitParam; m_pDxDiagProvider = NULL; m_pDxDiagRoot = NULL; g_DxDiagInfo = NULL; g_DxSoundInfo = NULL; // COMライブラリを使用できるように初期化 hr = CoInitialize(NULL); if (FAILED(hr)) { return false; } hr = CoCreateInstance( CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER, IID_IDxDiagProvider, (LPVOID*) &m_pDxDiagProvider); if( FAILED(hr) || m_pDxDiagProvider == NULL) { return false; } // DXDIAG_INIT_PARAMSを初期化 ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) ); dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS); dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION; // WHQLを確認するかどうか // ネットを経由するので基本的にはfalseにしておく dxDiagInitParam.bAllowWHQLChecks = AllowWHQLChecks; dxDiagInitParam.pReserved = NULL; hr = m_pDxDiagProvider->Initialize( &dxDiagInitParam ); if( FAILED(hr) ) { return false; } hr = m_pDxDiagProvider->GetRootContainer( &m_pDxDiagRoot ); if( FAILED(hr) ) { return false; } return true; } //////////////////////////////////////////////////////////////////////////////// // DxDiag でSystem情報を取得 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::GetSyatemInfo( void ) { HRESULT hr; IDxDiagContainer* pObject = NULL; DWORD nInstanceCount = 0; DWORD nItem = 0; DWORD nCurCount = 0; // "DxDiag_SystemInfo" を取得 if( FAILED( hr = m_pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pObject ) ) ) { return false; } // 情報保存領域の確保 ZeroMemory(&g_DxDiagSysInfo, sizeof(g_DxDiagSysInfo)); if( FAILED( hr = GetStringValue( pObject, L"szOSExLongEnglish", g_DxDiagSysInfo.cOS , sizeof(g_DxDiagSysInfo.cOS) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemManufacturerEnglish", g_DxDiagSysInfo.cManufacturer , sizeof(g_DxDiagSysInfo.cManufacturer) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemModelEnglish", g_DxDiagSysInfo.cModel , sizeof(g_DxDiagSysInfo.cModel) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szProcessorEnglish", g_DxDiagSysInfo.cProcessor , sizeof(g_DxDiagSysInfo.cProcessor) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szPhysicalMemoryEnglish", g_DxDiagSysInfo.cMemory , sizeof(g_DxDiagSysInfo.cMemory) ) ) ) { SAFE_RELEASE( pObject ); return false; } SAFE_RELEASE( pObject ); return true; } よろしくお願いいたします。

  • 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' : 定義されていない識別子です。