rc = waveInPrepareHeader(hwi,lpwh,sizeof(WAVEHDR));
のあと、「無効なパラメータがシステム機能に渡されました」となってしまいます。
ちなみに返ってきている値は「11」で、
どのエラーにもあてはまらないようです。
いったい何が原因なのか、
そして、どうすればいいのかがさっぱりわからず、困っています。
誰か教えてください‥‥‥。
デバイスのオープンは出来ている感じです‥‥。

変数の宣言(?)はプログラムの最初に、以下のように設定しています。
WAVEHDR wh;
HWAVEIN hwi;
HWND hWnd;
WAVEFORMATEX wfx;
MMRESULT rc;
LPWAVEHDR lpwh;

もし、必要な情報が不足しているならいって下さい。
質問の意味がわからない、とか‥‥‥。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

ずいぶん時間がたっていますが、もう解決されたでしょうか?



実際に使ったことはないのですが、ドキュメント&サンプルをみた範囲で。

エラーは MMSYSERR_INVALPARAM(11)でパラメータエラーです。


怪しそうなのは
 >デバイスのオープンは出来ている感じです。
 ということですが、waveInOpen()は成功していますか。
 
 DATABLOCK_SIZEっていくつでしょう。


VC++のヘルプで waveInPrepareHeader を調べると
 DIALOGS.C (コード)
 DDREC.EXE (ダウンロード先)
があるので参考までに。

この回答への補足

相変わらず返事が遅くてすいません。

まだ解決していないのでまた補足させていただきます。

waveInOpen()は成功しているようです。
そのすぐあとにつけているprintf()が働いているので‥‥。

DATABLOCK_SIZEは327680Lです。
参考にしたプログラムにのっていた値そのままです(苦笑)。

ところで、VC++のヘルプとは、
マイクロソフトのHP上にあるのでしょうか?
それともVC++のヘルプキーからでしょうか?
どうもDIALOGS.Cとかは見当たらないのですが‥‥。

補足日時:2001/09/13 11:03
    • good
    • 0

まったく 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 未経験ですが、一応、計算機屋の端くれなので「専門家」にチェックを入れてます

この回答への補足

返事が遅くなりましてもうしわけありません。

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;

ということはやっているのですが、これでは不十分でしょうか‥‥?

補足日時:2001/09/04 10:44
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsizeof(long), sizeof(short)   (処理系依存と言うけれど・・・)

 
数値(整数)型の定義サイズについて、質問です。

ANSIの規格では、

sizeof(short) ≦ sizeof(int) ≦ sizeof(long)

としか定義されていないので、実際にこれらの型が取る大きさは処理系依存だ、と聞きます。
しかし、VC++、BCCなど、知名度の高いコンパイラでは、いずれも、

sizeof(short) → 2
sizeof(int) → 2
sizeof(long) → 4

となっているようです。(手元にないので、gccでは確認していませんが・・・)
実際のところ、上記のサイズにならない処理系は実在するのでしょうか?

何故こんな質問をするのかというと、あるテキスト(事情があって、書名等の情報は出せないのですが)に

> 次の sizeof 演算子の返す値として正しいものはどれですか。
>
> long hoge[32];
> sizeof(hoge);
> ------------------------------------------------------
> A. 32
> B. 64
> C. 128
> D. 256
> E. 512

という問題が掲載されており、解説が、

> 正解は C 。
>
> long 型は 4 バイトで構成されるので、32 個の要素がある配列では、 128 バイトになります。

となっていたのです。(short型のサイズを問う類題あり)
特定の処理系が前提条件とされていないので、適切な設問、解説とは思えないのですが、誤りと断言できるほどの自信がないため、作者に指摘すべきか否か、迷っています。
sizeof(short) → 2、sizeof(long) → 4 にならない処理系が実在しなければ、規格の定義上は正しくなくても、実務上は誤りとは言えないような気もしますが、どうでしょうか?
コメントをお待ちしております。
 

 
数値(整数)型の定義サイズについて、質問です。

ANSIの規格では、

sizeof(short) ≦ sizeof(int) ≦ sizeof(long)

としか定義されていないので、実際にこれらの型が取る大きさは処理系依存だ、と聞きます。
しかし、VC++、BCCなど、知名度の高いコンパイラでは、いずれも、

sizeof(short) → 2
sizeof(int) → 2
sizeof(long) → 4

となっているようです。(手元にないので、gccでは確認していませんが・・・)
実際のところ、上記のサイズにならない処理系は実在するのでしょうか?

何故...続きを読む

Aベストアンサー

64ビットマシン向けの商用UNIXのほとんどでは、
sizeof(long)は 8
となっているはずです。(LP64モデルを採用)

ちなみに、
Win64では 4 のままです。(LLP64モデルを採用)

さらに重箱の隅をつつくようで申し訳ないですが、IA32向けのVC++や、BCCでは、sizeof(int)は 2 ではなく 4 を返しますね。ご確認を。

参考まで。

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

QSendMessage(hW,WM_CREATE,0,0);を

SendMessage(hW,WM_CREATE,0,0);
を実行するとシステムがWM_DOWNやWM_CHARを発行しなくなるみたいです
というのはそれ以降キー入力を無視するようになるのです
いったんアプリをアイコン化してウィンドウ化するとWM_DOWNやWM_CHARを発行するようになります
WM_CREATEを送ってもWM_DOWNやWM_CHARを発行しなくなるのを阻止するために何か方法はないでしょうか?

Aベストアンサー

>プログラムのイニシャライズのために送ったのですが送らないで住むプログラムに変更しました

普通はそんな方法はとりません。
システムが何をするか分からないからです。

自分でメッセージを定義して、初期化処理を行うようするためのメッセージを送るほうが無難です。
WM_CREATEと同じ処理を初期化処理として行わせたいのであれば、初期化処理を関数化して自分で定義したメッセージでも呼び出せばいいのですし。


>作ったプッシュボタンを押してシステムがWM_COMMANDを送ってきた後キー関係のメッセージを送ってくれなくなります

プッシュボタンがキーボードフォーカスを持ってのるでは?

ボタンがキーボードフォーカスを持っていてもキー関連のメッセージを親ウィンドウが受け取りたいのであれば、サブクラス化をするしかないでしょう。

Q1,1,2,3,5,8,13の合計

初心者ですみませんが、1,1,2,3,5,8,13の合計を出すプログラミングがどうしてもわかりません。どなたかご教示頂けましたら助かります。
宜しくお願いいたします。

Aベストアンサー

#include <stdio.h>

int main(void)
{
   printf("%d\n", 1+1+2+3+5+8+13);
}

Qfor( ; ti >= 0; ti--, ci++)

C言語のループの表記のことです

for ( ; ti >= 0; ti- -, ci++)
この意味がわかりません
自分なりに解釈すると「;ti >= 0」から始まって「 ci++ 」を繰り返しながら「 ti- - 」になるまで繰り返す、というような感じです

「;ti >= 0」から始まるとはどういう意味でしょうか?
「 ti- - 」になるまでとは???

このソースが書かれているHPです
http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H12a2/pm11.html
52行目になります


わかる方がいらっしゃったら教えてください、お願いします

Aベストアンサー

for() の 「初期設定式」「継続条件式」「再設定式」の区切りは、; です。
ですからこの場合、
初期設定式:なにもない(特に初期設定不要)
継続条件式: ti >= 0
再設定式: ti--, ci++
です。

さらに、再設定式に出てくる表現は、「コンマ演算子」といいまして、おおざっぱに言えば、コンマで区切られた式を順番に実行という意味です。
(関数の引数に現れるコンマとは別の意味です)

初期設定式のない for() は、すでにあるところから処理を継続する場合によく使われます。たとえば、

s = 0;
for (i = 0; x[i] == 0; i++); // x[i] の先頭部分の0の要素を捨てて
for(; x[i] > 0; i++)
s += x[i]; // 「そのあと」の正の部分が継続する間足し込む
という場合、

また、再設定式は、

for(i = 0, j = 10; src[i] != 0; i++, j--)
dest[j] = src[i];
のように、二つ(以上)のものを変化させたい場合。
この例では、初期設定式も、コンマ演算子を使って、2つの初期化を行っています。

for() の 「初期設定式」「継続条件式」「再設定式」の区切りは、; です。
ですからこの場合、
初期設定式:なにもない(特に初期設定不要)
継続条件式: ti >= 0
再設定式: ti--, ci++
です。

さらに、再設定式に出てくる表現は、「コンマ演算子」といいまして、おおざっぱに言えば、コンマで区切られた式を順番に実行という意味です。
(関数の引数に現れるコンマとは別の意味です)

初期設定式のない for() は、すでにあるところから処理を継続する場合によく使われます。たとえば、

s = 0;
...続きを読む


人気Q&Aランキング

おすすめ情報