• ベストアンサー

DirectInputについて再

前に回答してくださった方すみません。 directinputで、デバックに成功して実行してみるとすぐに強制終了してしまう問題なのですが。 VOID KeyCheck() { BYTE KeyState[256]; HRESULT hr; hr = g_lpDIDevice->GetDeviceState(256,KeyState); if (SUCCEEDED(hr)) { if (KeyState[DIK_LEFT]&0x80) muki=0; } } 強制終了が出なくなったのはこの処理が実行されていなかっただけらしく、まだおかしいみたいなんです。 hr = g_lpDIDevice->GetDeviceState(256,KeyState); この文辺りが怪しいと思って256をsizeof(KeyState)にしたりなどいろいろなサイトで違った方法を試したりなどしたのですが、解決しませんでした。 OSはVistaの32bitなのですが、どのようにすれば治るでしょうか?

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

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

 こんばんは。前回回答した者です。えぇと、拝見させて頂きました。グローバル変数がパラメータの名前になっていたりと、大分怪しい所だらけなのですが、「g_pKeyboard->SetCooperativeLevel」で強調レベルを設定した後の「g_pKeyboard->SetProperty」が抜けています。其の外にも「WM_ACTIVATE」を処理していない為、制御権の獲得が出来て居ない状態です。この状態での動作は絶望的かと。  以下修正品です。どの様にするのかを参考程度に見て下さい。 LPDIRECTINPUT8 g_pDI; LPDIRECTINPUTDEVICE8 g_pKeyboard; int muki; //此れは要らないのでは? HRESULT InitD3D(HWND hWnd) { return DI_OK; } //ジオメトリ? HRESULT InitGeometry() { return DI_OK; } //レンダリングして下さい void Render() { } //----------------------------------------------------------------------------- BOOL DI_Init(HWND hWnd, HINSTANCE hInst) { HRESULT hr = DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDI, NULL); if(FAILED(hr)) return FALSE; hr = g_pDI->CreateDevice(GUID_SysKeyboard, &g_pKeyboard, NULL); if(FAILED(hr)) return FALSE; hr = g_pKeyboard->SetDataFormat(&c_dfDIKeyboard); if(FAILED(hr)) return FALSE; hr = g_pKeyboard->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); if(FAILED(hr)) return FALSE; //キーボードの設定 //↓此れを設定しないといけません DIPROPDWORD dipdw; dipdw.diph.dwSize = sizeof(DIPROPDWORD); dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER); dipdw.diph.dwObj = 0; dipdw.diph.dwHow = DIPH_DEVICE; dipdw.dwData = 8; hr = g_pKeyboard->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph); //↑此処まで return SUCCEEDED(hr); } //----------------------------------------------------------------------------- VOID KeyCheck() { if(!g_pKeyboard) return; BYTE KeyState[256]; HRESULT hr = g_pKeyboard->GetDeviceState(256,KeyState); if(FAILED(hr)) { return; } if(KeyState[DIK_RIGHT]&0x80) { muki++; ::MessageBox(0, L"右ボタンが押された", L"入力テスト", MB_OK); } } LRESULT CALLBACK MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: { return TRUE; } case WM_CLOSE : { ::DestroyWindow(hWnd); return FALSE; } case WM_DESTROY : { ::PostQuitMessage(0); return FALSE; } case WM_ACTIVATE: { if(!g_pKeyboard) break; //制御権の切り替え if(wParam == WA_INACTIVE) { g_pKeyboard->Unacquire(); } else { g_pKeyboard->Acquire(); } return FALSE; } } return ::DefWindowProc(hWnd, uMsg, wParam, lParam); } INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT ) { MSG msg; WNDCLASSEX wc = {sizeof(WNDCLASSEX)}; wc.lpszClassName = L"D3D Tutorial"; wc.lpfnWndProc = MsgProc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.hInstance = hInst; wc.hIcon = LoadIcon(hInst,L"IDI_APPICON"); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.cbClsExtra = 0; wc.cbWndExtra = 0; if(!RegisterClassEx(&wc)) return FALSE; HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 06: Meshes", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,NULL, NULL, wc.hInstance, NULL ); ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); if(FAILED(InitD3D(hWnd))) return 0; if(FAILED(InitGeometry())) return 0; if(FAILED(DI_Init(hWnd, hInst))) return 0; //此処で権利を獲得する g_pKeyboard->Acquire(); while(TRUE) { if(::PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE)) { if(!::GetMessage(&msg, NULL, 0, 0)) break; ::TranslateMessage(&msg); ::DispatchMessage(&msg); } else //アイドリング { KeyCheck(); Render(); } } UnregisterClass( L"D3D Tutorial", wc.hInstance ); return 0; }

noname#142252
質問者

お礼

ありがとうございます。 今度はきっちり成功しました~

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

g_hInstとg_hWndはグローバルで宣言されているのですよね DI_Init() の hr = DirectInput8Create(g_hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDI, NULL); でg_hInstが初期化状態のままだと思われます。 FALSE(0)で返しているのをSUCCEEDED(>=0)で判定しているのでチェックできていません。 INT WINAPI wWinMain( HINSTANCE g_hInst, HINSTANCE, LPWSTR, INT ) を INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT ) にして g_hInst = hInst; をwWinMain( )内に追加しましょう。 それとグローバルで宣言しているなら HWND g_hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 06: Meshes", のHWNDを削除しましょう。

noname#142252
質問者

お礼

ありがとうございます、うまくいきました~

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

昔自分が作ったプログラムのソースを見てみたら以下のような処理をしていました hr = g_lpDIDevice->Acquire(); if (hr == DI_OK || hr == S_FALSE) { hr = g_lpDIDevice->GetDeviceState( 256, KeyState); if (SUCCEEDED(hr)) { if (KeyState[DIK_LEFT]&0x80) muki=0; } } 情報取得前にAcquireしてみたらどうでしょう

noname#142252
質問者

補足

g_pKeyboard->Acquire();は初期化の際に行っておりますが、試しに書いてみてもダメでした

全文を見る
すると、全ての回答が全文表示されます。
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

その部分だけ出されてもどうにもならないんだけど? 落ちてる部分やそれが関連するソース、ないし以前の質問とやらの番号を提示するべきじゃないかな。 このソースだけだと普通にしかみえない。

noname#142252
質問者

補足

以前の質問はこれですね http://okwave.jp/qa4310890.html?ans_count_asc=20 INT WINAPI wWinMain( HINSTANCE g_hInst, HINSTANCE, LPWSTR, INT ) { WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"D3D Tutorial", NULL }; RegisterClassEx( &wc ); HWND g_hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 06: Meshes", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, wc.hInstance, NULL ); if( SUCCEEDED( InitD3D( g_hWnd ) ) ) { if( SUCCEEDED( InitGeometry() ) ) { if( SUCCEEDED( DI_Init() ) ) { ShowWindow( g_hWnd, SW_SHOWDEFAULT ); UpdateWindow( g_hWnd ); MSG msg; ZeroMemory( &msg, sizeof(msg) ); while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { KeyCheck(); Render(); } } } } } UnregisterClass( L"D3D Tutorial", wc.hInstance ); return 0; } //----------------------------------------------------------------------------- BOOL DI_Init() { HRESULT hr; hr = DirectInput8Create(g_hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDI, NULL); if FAILED(hr) return FALSE; hr = g_pDI->CreateDevice(GUID_SysKeyboard, &g_pKeyboard, NULL); if FAILED(hr) return FALSE; hr = g_pKeyboard->SetDataFormat(&c_dfDIKeyboard); if FAILED(hr) return FALSE; hr = g_pKeyboard->SetCooperativeLevel(g_hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); if FAILED(hr) return FALSE; hr = g_pKeyboard->Acquire(); if FAILED(hr) return FALSE; return TRUE; } //----------------------------------------------------------------------------- VOID KeyCheck() { BYTE KeyState[256]; HRESULT hr; hr = g_pKeyboard->GetDeviceState(256,KeyState); { if (KeyState[DIK_RIGHT]&0x80) muki++; } } wWinMainのKeyCheck();を消すと普通に動作しました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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の勉強に簡単なものを書いてみようと思ったのですが、どの辺りがいけないのでしょうか?

  • DirectInputが上手く動きません;

    DirectInputを使って操作は正しく取得できるようになったのですが、 つぎはぎで最低限動く所にこぎつけただけで 色々問題が有ります・・orz 1.フォーカスを別アプリに移して戻すと、一切操作を受付けなくなる。 2.Unacquire(); を入れなければならないらしいけれど、入れるべき場所が解らない 3.動かしてみる度に、マウス座標の受け取りが劣悪な程遅くなってくる。。 コードは大よそ以下のようになっています。 どこか怪しい部分がわかる方が推察できる方がいらっしゃいましたら ご指摘願います、その部分のコード全体を書き出そうと思います。 よろしくお願い致します。 orz --------------------------------- //●Inputクラス 初期化用関数内 DirectInput8Create(); //オブジェクト作成 lpDI lpDI->CreateDevice(); //マウス用作成 lpDIDeviceM lpDIDeviceM->SetDataFormat(); lpDIDeviceM->SetCooperativeLevel() lpDIDeviceM->Acquire(); lpDI->CreateDevice(); //キーボード用作成 lpDIDeviceK lpDIDeviceK->SetDataFormat(); lpDIDeviceK->SetCooperativeLevel() lpDIDeviceK->Acquire(); //●Inputクラス マウス用状態取得関数内(キーボードも同じ構造です) DIMOUSESTATE dims; HRESULT hr2; hr2 = lpDIDeviceM->GetDeviceState( sizeof(DIMOUSESTATE), &dims ); if (hr2==DIERR_INPUTLOST) { g_lpDIDeviceM->Acquire(); } else if (SUCCEEDED(hr2)) {  // 受け取り処理 } //●Inputクラス デストラクタ処理 //Unacquire();をすべき場所はここなのでしょうか SAFE_RELEASE( lpDIDeviceK ); SAFE_RELEASE( lpDIDeviceM ); SAFE_RELEASE( lpDI ); ---------------------------------

  • 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; } } が、上手く動くのでまねをしたのですが上手く行きません。 すみませんが、アドバイスお願いします。

  • DirectInput でのエラー

    LPDIRECTINPUT8 m_pDI; LPDIRECTINPUTDEVICE8 m_pJoystick; 省略 // ゲームコントローラーの列挙 if(FAILED(hr = m_pDI->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoysticksCalback, NULL, DIEDFL_ATTACHEDONLY))) return hr; //********************************************************/ BOOL CALLBACK InputDevice::EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext ) { HRESULT hr; hr = m_pDI->CreateDevice(pdidInstance->guidInstance, &m_pJoystick, NULL); if(FAILED(hr)){ return DIENUM_CONTINUE; }else{ return DIENUM_STOP; } } ゲームコントローラーの列挙をするためのコードを msdn や DirectXSDK のサンプルを 参考に書きました。でもどうしても以下のようなエラーがでます。 キャストなど試してみましたが解決にはいたりませんでした。 どうかご教授おねがいします。 d:\○○△△.cpp(30) : error C2664: 'IDirectInput8A::EnumDevices' : 2 番目の引数を 'BOOL (const DIDEVICEINSTANCE *,void *)' から 'LPDIENUMDEVICESCALLBACKA' に変換できません。

  • 描画について

    サイズを綺麗に描画したいのですが(サイズの範囲(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; } よろしくお願いします。

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

  • 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++ で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; よろしくお願いします。

  • 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 が上手く動作しないという事があるのでしょうか? 宜しくお願いします。

  • Directxについて

    1つご教授お願い申したいのですが、 HRESULT DrowInitialize(HWND hWnd) { LPDIRECT3D9 g_pD3D; D3DPRESENT_PARAMETERS g_D3DPP; g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); if(g_pD3D==NULL) { return S_FALSE; } ZeroMemory(&g_D3DPP,sizeof(g_D3DPP)); g_D3DPP.Windowed =TRUE; g_D3DPP.SwapEffect =D3DSWAPEFFECT_DISCARD; g_D3DPP.BackBufferFormat = D3DFMT_UNKNOWN; HRESULT hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { hr =g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { return S_FALSE; } } } return S_OK; } なのですが、これが通らなくて困っています。(S_FALSEを通ってしまいます)S_OKを通るにはどうしたらいいのでしょうか。わかる方いらしたらよろしくお願いします。

このQ&Aのポイント
  • ADFで両面コピーをしようとしても一面しか印刷されない問題が発生しています。片面のスキャンが終わると原稿が排出され、裏面が飲み込まれません。また、一面が印刷された用紙は再度飲み込まれても印刷されず戻ってきます。
  • お使いの製品でADFを使用している際に両面コピーがうまく動作しない問題が発生しています。片面のスキャンが終わると原稿が排出され、裏面が受け取られません。また、一面がコピーされた用紙は再度取り込まれても印刷されず戻ってきます。
  • 質問者様の環境においてADFを使用した両面コピーができない問題が発生しています。片面のスキャンが終わると原稿が排出され、裏面がスキャンされません。また、一面がコピーされた用紙は再度取り込まれても印刷されないまま戻ってきます。
回答を見る