• 締切済み

「WaveIn~」関数について。

rc = waveInPrepareHeader(hwi,lpwh,sizeof(WAVEHDR)); のあと、「無効なパラメータがシステム機能に渡されました」となってしまいます。 ちなみに返ってきている値は「11」で、 どのエラーにもあてはまらないようです。 いったい何が原因なのか、 そして、どうすればいいのかがさっぱりわからず、困っています。 誰か教えてください‥‥‥。 デバイスのオープンは出来ている感じです‥‥。 変数の宣言(?)はプログラムの最初に、以下のように設定しています。 WAVEHDR wh; HWAVEIN hwi; HWND hWnd; WAVEFORMATEX wfx; MMRESULT rc; LPWAVEHDR lpwh; もし、必要な情報が不足しているならいって下さい。 質問の意味がわからない、とか‥‥‥。

  • nyako
  • お礼率50% (5/10)

みんなの回答

回答No.2

ずいぶん時間がたっていますが、もう解決されたでしょうか? 実際に使ったことはないのですが、ドキュメント&サンプルをみた範囲で。 エラーは MMSYSERR_INVALPARAM(11)でパラメータエラーです。 怪しそうなのは  >デバイスのオープンは出来ている感じです。  ということですが、waveInOpen()は成功していますか。    DATABLOCK_SIZEっていくつでしょう。 VC++のヘルプで waveInPrepareHeader を調べると  DIALOGS.C (コード)  DDREC.EXE (ダウンロード先) があるので参考までに。

nyako
質問者

補足

相変わらず返事が遅くてすいません。 まだ解決していないのでまた補足させていただきます。 waveInOpen()は成功しているようです。 そのすぐあとにつけているprintf()が働いているので‥‥。 DATABLOCK_SIZEは327680Lです。 参考にしたプログラムにのっていた値そのままです(苦笑)。 ところで、VC++のヘルプとは、 マイクロソフトのHP上にあるのでしょうか? それともVC++のヘルプキーからでしょうか? どうもDIALOGS.Cとかは見当たらないのですが‥‥。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

まったく WAVE 関連はやったことが無いのですが、質問の範囲から ありそうな間違いを。 > WAVEHDR wh; > LPWAVEHDR lpwh; > rc = waveInPrepareHeader(hwi,lpwh,sizeof(WAVEHDR)); lpwh = &wh; rc = waveInPrepareHeader(hwi,lpwh,sizeof(WAVEHDR)); ってやってますか? 後、他の API でもよくありがちな話として、 ・WAVEHDR は、0でクリアしておく ・WAVEHDR がバージョンのような数字をメンバに持っていて、それが不当 ・WAVEHDR のメンバで領域を割り当てておくようなところがあって、それをやってない なんてところを思いつきますが。 # WAVE 未経験ですが、一応、計算機屋の端くれなので「専門家」にチェックを入れてます

nyako
質問者

補足

返事が遅くなりましてもうしわけありません。 lpwh=&wh; は、やっていませんでした。 でも、追加して実行しても結果は変わりませんでした‥‥。 WAVEHDRは0でクリアしてあります。 >・WAVEHDR がバージョンのような数字をメンバに持っていて、それが不当 >・WAVEHDR のメンバで領域を割り当てておくようなところがあって、それをやってない の2点に関しては‥‥‥意味がよくわかりません‥‥。 ZeroMemory(&wh,sizeof(WAVEHDR)); wh.lpData = (char *)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,DATABLOCK_SIZE); wh.dwBufferLength = DATABLOCK_SIZE; ということはやっているのですが、これでは不十分でしょうか‥‥?

関連するQ&A

  • RPGのプログラム感のパラメーター

    サブプロにパラメーターを渡し、処理をさせたいのですが、 サブプロは曜日計算をさせるもので、 パラメーターはA(4桁の西暦),B(2桁の月),C(2桁の日付)の変数で、 それぞれ桁数が4,2,2小数点桁数はすべて0です。 この3つを渡し、処理をさせWEEKという変数に曜日を算出させ、元のプログラムにその値を返したいのですが、受け渡しと値の戻し方がわかりません。 受け渡し側のパラメーターの宣言の仕方、CALLの仕方、WEEKの値の受け取り方 受け渡される側のパラメータの宣言の仕方、値の戻し方を教えてください。 よろしくお願い致します。

  • WinAPI

    起動をするプログラムなのですが DWORD i; i = timeGetTime(); ShellExecuteA(hWnd, "open", hogeEXE, "引数1 引数2 ○",NULL,0); と、このようにやって 引数1 引数2 21345678(適当な値です。) とやりたいのですが 変数を渡すにはどうすればよいでしょうか?

  • COUNTIF関数を記録の続き

    先ほどのB列~F列の列数は変動します。その列数は変数iを宣言してあります。なのでA列を一概にRC[-6]と指定できないんです。説明不足ですみません。

  • ポインタのsizeofについて

    C初心者です。 ポインタ宣言させた変数をsizeof()で値を取得させて 表示させてみました。 char *cp; short int *sp; int *ip; i = sizeof(cp); printf("%d\n",i); i = sizeof(sp); printf("%d\n",i); i = sizeof(ip); printf("%d\n",i); 結果は全て4となりました。 これはなぜですか? (ただの変数として宣言すれば1、2、4となります。この理由も理解できています。)

  • 変数の宣言について

    変数の宣言のことなんですけど,何個ぐらい宣言できるのでしょうか?相当な数を宣言するとメモリ不足になってしまうそうで・・・。これから作ろうとしているプログラムは変数を相当数(それこそ万単位)なもので。ご回答の方,よろしくお願いします。

  • StretchBlt関数について

    StretchBlt関数について 画像を縮小して表示しようとしていますが、上手くいきません。 beforeはint型の変数で現在「0」が入っていますので、 無視していただきたいと思います。 まず、テストでStretchBlt関数で縮小しない状態で画面縦幅の中央に表示しようと 下記コードで試みましたが、横は問題ないようですが、 縦に拡大1.5倍くらい拡大されてしまいました。 int MyBitOpen(HWND hWnd,HDC hNormalDC,DataParam *data){ HBITMAP hBitmap; BITMAP bmpInfo={0}; HDC hBitDC; RECT rc; hBitDC=CreateCompatibleDC(NULL); hBitmap=(HBITMAP)LoadImage(NULL,data->szFile[data->iFileCount], IMAGE_BITMAP,0,0,LR_LOADFROMFILE); GetObject(hBitmap,sizeof(BITMAP),&bmpInfo); SelectObject(hBitDC,hBitmap); GetClientRect(hWnd,&rc); StretchBlt(hNormalDC,before+5,(rc.bottom-bmpInfo.bmHeight)/2, (before+5)+bmpInfo.bmWidth,((rc.bottom-bmpInfo.bmHeight)/2)+bmpInfo.bmHeight, hBitDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY); 関数から戻り BitBlt(hdc,0,0,rc.right,rc.bottom,hNormalDC,0,0,SRCCOPY); で画面出力しております。 これがうまくいかない理由もわかりませんが、 下記のように(1)StretchBltを使用せずBitBltに書き換えただけのものと (2)StretchBltを使用しても描画開始座標を(0、0)に変更したものは 拡大されず上手くいってしまいます。 (1) BitBlt(hNormalDC,before+5,(rc.bottom-bmpInfo.bmHeight)/2, (before+5)+bmpInfo.bmWidth,((rc.bottom-bmpInfo.bmHeight)/2)+bmpInfo.bmHeight, hBitDC,0,0,SRCCOPY); (2) StretchBlt(hNormalDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight, hBitDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY); 座標の取得は間違っていないと思うのですが・・ 本来は画面中央に縦横1/2に縮小した下記のコードでしたが まず上記がうまくいっていないので・・・ 初心者のためシンプルに書けませんでした↓ StretchBlt(hNormalDC,((before+5)+(bmpInfo.bmWidth/4)), (((rc.bottom-bmpInfo.bmHeight)/2)+(bmpInfo.bmHeight/4)), (((before+5)+bmpInfo.bmWidth)-(bmpInfo.bmWidth/4)), ((((rc.bottom-bmpInfo.bmHeight)/2)+bmpInfo.bmHeight)-(bmpInfo.bmHeight/4)), hBitDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY); ご教授よろしくお願いします。

  • WINAPIのスレッドについて教えてください

    WINAPIのスレッドについて教えてください スレッドを作成して写真をスライドショウー的に表示しようしていますが、 上手くいきません。 typedef struct _dataparam{ HWND hWnd; HDC hSlidDC; int iFileCount; TCHAR szFile[100][MAX_PATH]; HBITMAP hBitmap[100]; }DataParam; という構造体を作成して、各変数に必要な値を代入した後 BIT_SLIDというメッセージが来た場合Threadを作成。 LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { static DataParam data={0}; case WM_CREATE: data.hWnd=hWnd; ・ ・ case BIT_SLID: slidCheck=TRUE; CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SlidThread, (LPVOID)&data,0,&dwThreadId); return 0; Thread関数内でGetClientRectにより下記のように Windowのサイズを測ろうとしましたが rcには正しいWindowのサイズ格納されていません。 DWORD WINAPI SlidThread(LPVOID vdParam) { DataParam *SlidData; RECT rc={0}; SlidData=(DataParam *)vdParam; GetClientRect(SlidData->hWnd,&rc); ・ ・ ・ hWnd以外のiFileCountやszFile[100][MAX_PATH]の値を調べると 問題なく引き渡しているようなのですが、 rcのleft=0 light=459 top=760 bottom=-2142242063となっていました。 けれどThread関数内で InvalidateRect(SlidData->hWnd,NULL,TRUE); 再描画を行います。 ちなみに下記の自作関数では問題なくWindowサイズを取得しております。 int MySetBitmap(HDC hNormalDC,DataParam *data) { GetClientRect(data->hWnd,&rc); ・ ・ ・ 環境はMicrosoft Visual C++ 2008 Express Editionです それと別件なのですが、デバックでローカルに表示される変数と 表示されない変数がありますがその違いを教えていただければ幸いです。 今回SlidDataは表示されません。 ご教授お願いします。

  • 1つ前の値を変数に保存する方法

    ある値を測定し、その値を基にして様々な計算を行うプログラムがあります。 そのプログラムが呼び出される度に値は更新されていくとして、 更新される1つ前の値を変数などに保存するにはどういった方法をとればいいのでしょうか? 変数を宣言してそこに1つ前の値を保存すればいいってことは分かるのですが、 1つ前の値をどうやってとってくればいいのかが分かりません。 質問内容が漠然としていて恐縮なのですが、ご助言を賜りたいです。 よろしくお願い致します。

  • 引数の渡し方について

    引数の渡しかたが悪いのかどうしてもうまく行きません。 何が悪いのでしょうか? 呼び出し元では文字列のポインタだけを渡して(プログラム中の第3引数) 呼び出し先でその文字列に値を設定しようとしています。 呼び出し元の変数宣言・・・ char pcImagePonit[65535]; 呼び出し元の関数 bRet = ReadPhysicsData(pcImagePonit); 呼び出し先の関数宣言 int ReadPhysicsData(char *sData) char nBufferB[65536]; 呼び出し先で値を設定 memcpy(sData, nBufferB, sizeof(nBufferB)); です。 呼び出し元で65535バイト確保した変数が、呼び出し先の関数に来てsDataになった時点で1バイトになってしまっています。 65535バイト分のデータを呼び出し先の関数内でセットしたいのですがどのようにしたら良いのでしょうか??

  • プログラムの原理について

    プログラムはメモリ上どのように展開されているのか、宣言した変数はメモリにどう割り付けられるのか、変数を参照したり、変数に値を入れるときはどういう仕組みになっているのか等わかりやすく教えてください。お願いします。 また、宣言、定義などといった言葉に関しての質問になるのですが、定義は記憶が割り当てられていて、宣言は割り当てられていないと本にはあるのですが、これはメモリとスタックとの違いでよいのでしょうか?また、構造体は定義されていると書かれているのですが、その構造体の中のintの宣言は、定義になるのでしょうか?