• ベストアンサー

可変長バイナリを読み込みたい

<プログラム環境> Windows XP,VC++6.0,MFC AppWizard(exe),ダイアログベース <目的> COMポートから可変長のバイナリデータを受信する <質問> 受信するバイナリの長さは受信した内容で分かるようになっています。 例えば、 先頭が"0x0b"であれば11個のバイナリが続いて送られてくるという感じです。 この例ように、送られてくる内容("0x0b")を確認して、それに応じて 11個データを読み込む、というプログラムにするには、どのようにしたら良いでしょうか? 今は以下のソースで、バイナリの長さを指定して受信しています。 //////////オーバーラップ構造体の初期化////////// OVERLAPPED old; ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = hEvent; //////////データ受信//////////////////////////// unsigned char rdBuf[10]; unsigned char* prdBuf; DWORD dwCount; DWORD dwRead; prdBuf = &rdBuf[0]; dwCount = 10; if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,INFINITE) == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE)){ //"データ受信完了" }}} else //エラー } 宜しければ、ご指摘の程よろしくお願いします。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

考え方としては (1)1バイト読み込む (2)読み込んだデータ=0なら終了 (3)読み込んだデータを入力バイト数に指定してデータを読み込む となりましょうか。 尚、ReadFileの後、無期限でWaitするくらいならオーバーラップする必要は ないと思いますが、特別な理由でもあるのでしょうか? unsigned char rdBuf[256]; unsigned char ucLen; DWORD dwCount; DWORD dwRead; if(ReadFile(hCom,&ucLen,1,&dwRead,NULL)){   if( ucLen == 0 ) return;   dwCount = ucLen;   if(ReadFile(hComrdBuf,dwCount,&dwRead,NULL)){     //"データ受信完了"     return;   } } //エラー

meeyooyoo
質問者

補足

的確なアドバイス有難うございます! 教えて頂いた方法でできました。 そして、無期限のwaitをやめて、100ミリセカンドだけ待つようにしました。 dwReadには読み込んだバイト数が格納されると思うのですが、 1バイト読み込んだ後に、 char Buf[256]; wsprintf(Buf,"dwRead = %d",dwRead); MessageBox(Buf); とすると、"dwRead = 0"が表示されるのは何故でしょうか? 確実に1バイトは読み込まれているハズなので、"dwRead = 1"となって欲しいです・・。 ご指摘の程よろしくお願いします。

その他の回答 (7)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.8

>set_time_limit()という関数を使うことなのでしょうか? お得意のReadFileを使うんです。100mSでタイムアウトになるヤツ ハンドルが標準入力になります。でも、SleepでOKなら、その方が ベターだと思います。標準入力はコンソールアプリケーションで ないと取得できませんから。

meeyooyoo
質問者

お礼

nda23様のおかげで、私がやりたいプログラムにかなり近づきました!とてもご親切に回答下さり有難うございました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.7

(1)自動リセットですね。問題ありません。 (2)ここだけの話ではハッキリとした原因は特定できません。  空のメッセージボックスの代わりにSleep(100)を入れてみますか…  あるいは標準入力からタイムリミット付きの入力を入れてみるとか…  後者のような気がしますけど、推測の域を出ません。

meeyooyoo
質問者

補足

有難うございます。 Sleep(); を使えば、できました。 77ミリ秒あたりが閾値で、成功したり失敗したりします。 原因が分からないうちは100ミリ秒あたりを指定しておこうと思います。 「標準入力からタイムリミット付きの入力」とは set_time_limit()という関数を使うことなのでしょうか? よろしくお願いします。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.6

(1)イベントハンドラを初期化していないのでは?  つまり、最初からシグナル状態だったり、自動リセットでないハンドルをResetしないで使い回すとか…  CreateEventの指定値を公開してください。 (2)error C2664: 'wsprintfA' : 1 番目の引数を 'unsigned char *' から 'char *' に~  ヘッダファイルの中にwsprintfの定義があり、第1引数は(char*)と指定されているためです。  charとunsigned charは最上位ビットを符号と見るかどうかの差だけで、  バイト単位のデータであることに変わりはありません。こういう場合はキャストします。  wsprintf( (char *)prdBuf,~

meeyooyoo
質問者

補足

nda23様有難うございます。 (1) // イベントオブジェクトを作成する hEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); if( hEvent == NULL ) MessageBox("イベント作成エラー",NULL,MB_ICONSTOP); です。 自動リセットなので、シグナル状態のままになる事はありませんよね? (2) ご指摘の通りに修正してエラーは無くなりました。 回答ANo.4の補足にある、 wsprintf(Buf,"dwRead = %d",dwRead); MessageBox(Buf); の部分で"dwRead = 0"と出力される事に関して一つ気づきました。 ReadFile()の前に、MessageBox("")すると"dwRead = 1"のように正しい値が出力され、ReadFile()までに一回もMessageBoxを使わないと"dwRead = 0"と出力されます。 この現象の原因は何かご存じでしょうか? よろしくお願いします。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

WaitForSingleObjectの戻り値はDWORDなので、BOOL bLError で受けるのは… 戻り値はWAIT_TIMEOUTでなければ成功と見てよいでしょう。 http://msdn.microsoft.com/ja-jp/library/cc429427.aspx wsprintf(Buf,"dwRead = %d",dwRead); MessageBox(Buf); この結果は"dwRead = 1"ですか? 尚、Bufはchar Buf[16]とか定義してありますか? ※スタックは4バイト境界に取られるので、[13]としても節約になりません。 受信長にかかわらず10バイトを16進で表示していますが、自動変数は初期化されて いないので、何らかの表示はされますが、受信したものかどうかは怪しい。 prdBuf = Buf; // &Buf[0] としなくても良い。 prdBuf += wsprintf(prdBuf,"%s","文字 ="); for ( int i = 0 ; i < dwRead ; i++ ) {   prdBuf += wsprintf(prdBuf," %02X",rdBuf[i]); } MessageBox(Buf); 上記のようにしてください。 ただし、Bufは十分な大きさを確保しておいてください。 マルチスレッドを制御できると、処理時間を半分くらいに短縮できるようになります。 頑張って習得してくださいね。

meeyooyoo
質問者

補足

nda23様、有難うございます!! >WaitForSingleObjectの戻り値はDWORDなので、BOOL bLError で受けるのは… 宣言をDWORD型に変更しました。 >戻り値はWAIT_TIMEOUTでなければ成功と見てよいでしょう。 else if(bLError == WAIT_TIMEOUT)のメッセージが出なかったので成功ですね^^ >wsprintf(Buf,"dwRead = %d",dwRead); >MessageBox(Buf); >この結果は"dwRead = 1"ですか? この結果が"dwRead = 0"なんです・・。本当に何故か分かりません。 しかし、最後に wsprintf(Buf,"dwRead = %d",dwRead); MessageBox(Buf); を書いて実行すると"dwRead = 6"となりました。こちらは正しい値が出るので、ますます分かりません・・。 >尚、Bufはchar Buf[16]とか定義してありますか? 失礼しました。Bufの定義はchar Buf[256];としています。 >受信長にかかわらず10バイトを16進で表示していますが、自動変数は初期化されて >いないので、何らかの表示はされますが、受信したものかどうかは怪しい。 はい、初期化していないので、「02 80 9a 00 b1 56 cc cc cc cc」と表示されています。因みに先頭は「06」ですので、6個受信してます。 初期化の仕方は宣言の際にchar Buf[256]="";でいいのでしょうか?こうしても、「02 80 9a 00 b1 56 cc cc cc cc」が表示されました。 >prdBuf = Buf; // &Buf[0] としなくても良い。 かなりスッキリしました。 >prdBuf += wsprintf(prdBuf,"%s","文字 ="); >for ( int i = 0 ; i < dwRead ; i++ ) { >  prdBuf += wsprintf(prdBuf," %02X",rdBuf[i]); >} >MessageBox(Buf); >上記のようにしてください。 「error C2664: 'wsprintfA' : 1 番目の引数を 'unsigned char *' から 'char *' に変換できません。」というエラーが出るのですが、なぜでしょうか? >ただし、Bufは十分な大きさを確保しておいてください。 Bufのサイズは256で十分なのでしょうか・・? 何度も質問を繰り返して申し訳ありませんが、よろしくお願いします。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

>確実に1バイトは読み込まれているハズなので、 本当ですか? オーバラップしたんでしょ。読み込み完了前に制御は戻ってきますよね。 読み込みが完了する前なら、dwReadの内容は0もありえる値です。 100ミリ待てば入力が完了する保証はあるのでしょうか? 失礼ですが、マルチスレッドを扱える技術がおありでしょうか? シングルスレッドで、オーバラップした以上、dwRead=0は入力タイムアウトで、 エラー処理になるべきです。 >unsigned char rdBuf[dwCount]; Basicではないので、こんな方法では領域を確保できません。 例え、1バイトでもメモリを取得する場合はGlobalAlloc等の関数を使います。 http://msdn.microsoft.com/ja-jp/library/cc430065.aspx でも、符号無し8ビット整数の最大値(256)くらいなら、こういう関数を使う程ではありません。 サンプルでもそうなっていますね。但し、読み込んだデータを蓄積していく場合では 動的なメモリの確保が必要になってきます。

meeyooyoo
質問者

補足

ご回答有難うございます!! ご指摘の通りマルチスレッドの知識は全くありません・・。 これからマルチスレッドを学習して、データ送信と受信を同時に行うプログラムを作る予定です。 以下に今のソースを示します。 コメントアウト部分はMessageBox等で表示する処理をしています。 実行すると、タイムアウトなどのエラーに関する表示は無く、先頭のバイナリの情報で得た長さ分のデータを受信し、その内容が正しく表示されました。 なので、受信は出来ていると思っているのですが、やはり受信できていないでしょうか? //////////先頭の1バイトだけ受信する///////////////////////////////////////// BOOL bLError; unsigned char ucLen; DWORD dwCount = 1; DWORD dwRead; if(ReadFile(hCom,&ucLen,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ bLError = WaitForSingleObject(hEvent,100); if(bLError == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE));//データ受信完了 } else if(bLError == WAIT_FAILED);//受信スリープエラー else if(bLError == WAIT_TIMEOUT);//受信タイムアウト } else ;//受信エラー } //////////メッセージボックスでdwReadの値を表示////////////////////////////// wsprintf(Buf,"dwRead = %d",dwRead); MessageBox(Buf); //////////先頭データの情報から可変長で読み込む////////////////////////////// unsigned char rdBuf[256]; unsigned char* prdBuf; prdBuf = &rdBuf[0]; dwCount = ucLen; if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ bLError = WaitForSingleObject(hEvent,100); if(bLError == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE))));//データ受信完了 } else if(bLError == WAIT_FAILED);//受信スリープエラー else if(bLError == WAIT_TIMEOUT);//受信タイムアウト } else ;//受信エラー } //////////受信したデータ10バイト分をMessageBoxで表示////////////////////// wsprintf(Buf,"文字 = %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",rdBuf[0],rdBuf[1],rdBuf[2],rdBuf[3],rdBuf[4],rdBuf[5],rdBuf[6],rdBuf[7],rdBuf[8],rdBuf[9]); MessageBox(Buf); GlobalAllocは今抱えているトラブルを解決したら、試してみます。

  • jx-word
  • ベストアンサー率40% (38/94)
回答No.3

指定されたバイト数を"読み込む"と考えると面倒なので、適当なバイト数をまとめて読み込んで、そこから必要な情報を取り出してはどうでしょうか。 unsigned char rdBuf[256]; int len; if( ReadFile( hCom, rdBuf, sizeof( rdBuf), &dwRead, NULL)){  len = rdBuf[0];    memcpy( コピー先, &rdBuf[1], len); }else{  エラー処理 } ↑は1回のReadFileで全部読めることを前提として単純に書いてますが、途中で切れたことを考えるとループで回してバッファに詰める処理が必要です。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

1バイト読む→データのサイズを確認する→そのバイト数分読み込む でいいと思いますけど。 Cなら最初の1バイトを読んでからデータ用のメモリーを確保してもいいのでは?

meeyooyoo
質問者

補足

有難うございます。 dwCount=6となったので、6バイト分のメモリを確保しようと、 unsigned char rdBuf[dwCount]; としたのですが、以下3つのエラーが出ました。 定数式が必要です。 サイズが 0 の配列を割当てまたは宣言しようとしました。 'rdBuf' : サイズが不明です。 dwCountの値を使って、メモリーを確保するにはどうしたら良いのでしょうか? ご指摘の程よろしくお願いします。

関連するQ&A

  • バイナリを16進数で表示したい

    VC++6.0,MFC,ダイアログベースでバイナリデータ受信とファイル書き込みのプログラムを作っています。 COMポートからバイナリを10バイト受信し、受信した内容を1.txtに書き込み、1.txtを開いて、受信した内容を確認したいです。 以下のソースで実行すると、1.txtにはFフフフフフフフフフと書かれていました。これを16進数で表示させたり、10進数で表示させるにはどうしたらいいでしょうか? /////////データ受信////////////// unsigned char rdBuf[10]; unsigned char* prdBuf; DWORD dwCount; DWORD dwRead; prdBuf = &rdBuf[0]; dwCount = 10; if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,INFINITE) == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE)){ //"データ受信完了" }}} else //エラー } /////////ファイルに書き込む////////////// HANDLE hFile; hFile = CreateFile( ".\\ScanData\\1.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL ); if(WriteFile( hFile, rdBuf,10, &wbyte, &old ) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,INFINITE)==WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&wbyte,TRUE)){ //書き込み完了 }}} else //書き込み失敗 }

  • ReadFileでエラーが出ます。

    シリアルポートで非同期でバイナリを受信するプログラムを作成しています。 受信部分は以下のソースです。これで実行すると「データ受信エラー」のダイアログが出ます。 GetLastErrorでは998(メモリ ロケーションへのアクセスが無効です。)が得られました。 ネットで調べましたが何が原因かも分かりません・・。 どうかアドバイスお願いします。 HANDLE hEvent; hEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); OVERLAPPED old; ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = hEvent; DWORD dwCount; char* rdBuf; DWORD dwRead; if(!ReadFile(hCom,rdBuf,dwCount,&dwRead,&old)){ if(ERROR_IO_PENDING == GetLastError()){ GetOverlappedResult(hCom,&old,&dwRead,TRUE); } else MessageBox("データ受信エラー","試作1",MB_ICONSTOP); }

  • バイナリをテキストファイルに書き込みたい

    <プログラム環境> Windows XP,VC++6.0,MFC AppWizard(exe),ダイアログベース <目的> COMポートから受信した可変長バイナリデータを1.txtに書き込む。 ※バイナリエディタを使用せずに16進数で読めるように書く <質問> 受信したバイナリデータは「02 80 9a 00 b1 56」なのですが、これをテキストファイルに16進数で書き込むことができません。 どのようにしたら良いでしょうか? 今は以下のソースです。 コメントアウト部分はMessageBox等で表示する処理をしています。 先頭1バイト受信→"06"を受信したのでさらに6バイト受信→6バイト書き込む。という順序です。 以下で実行するとファイルには「 00000」と書き込まれました。何なのか全く分かりません・・。 //////////先頭の1バイトだけ受信する///////////////////////////////////////// DWORD bLError; unsigned char ucLen; DWORD dwCount = 1; DWORD dwRead; if(ReadFile(hCom,&ucLen,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ bLError = WaitForSingleObject(hEvent,100); if(bLError == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE));//データ受信完了 } else if(bLError == WAIT_FAILED);//受信スリープエラー else if(bLError == WAIT_TIMEOUT);//受信タイムアウト } else ;//受信エラー } //////////先頭データの情報から可変長で読み込む////////////////////////////// unsigned char rdBuf[256]; unsigned char* prdBuf; prdBuf = &rdBuf[0]; dwCount = ucLen; if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ bLError = WaitForSingleObject(hEvent,100); if(bLError == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE))));//データ受信完了 } else if(bLError == WAIT_FAILED);//受信スリープエラー else if(bLError == WAIT_TIMEOUT);//受信タイムアウト } else ;//受信エラー } //////////データ書き込み///////////////////////////////////////////////////// HANDLE hFile; hFile = CreateFile( ".\\ScanData\\1.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED,NULL ); char Buf[256]; char wBuf[256] = ""; wsprintf(Buf,"%#02x",rdBuf); for(BYTE i=1;i<dwRead;i++){ wsprintf(Buf,"%#02x ",rdBuf[i]); wBuf[i] = Buf[0]; } if(WriteFile( hFile, wBuf,dwRead, &wbyte, &old ) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,1000)==WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&wbyte,TRUE)){//データ書き込み完了 }}} else ;//データ書き込みエラー } //////////受信したデータ10バイト分をMessageBoxで表示////////////////////// wsprintf(Buf,"文字 = %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",rdBuf[0],rdBuf[1],rdBuf[2],rdBuf[3],rdBuf[4],rdBuf[5],rdBuf[6],rdBuf[7],rdBuf[8],rdBuf[9]); MessageBox(Buf); 宜しければ、ご指摘の程よろしくお願いします。

  • 16進数の表示ができません。

    シリアルポートで受信したバイナリデータを表示させると、 正しい値が出ないのですが、どうしてでしょうか? 受信するデータは16進数で 06 02 81 07 00 bb 01 b4 00 32 なのですが、以下のソースで実行すると、 6 2 ffffff80 7 0 ffffffbb 1 ffffffb4 0 32 と表示されました。 また、「データ受信完了」というメッセージが出ないのですが、 出なくてもデータ受信は出来ているのでしょうか? char szBuf[256]; char rdBuf[10]; char* prdBuf; DWORD dwCount; DWORD dwRead; dwCount = 10; prdBuf = &rdBuf[0]; if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,INFINITE); == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE)) MessageBox("データ受信完了"); } } else MessageBox("データ受信エラー","試作1",MB_ICONSTOP); } wsprintf(szBuf,"文字 = %x %x %x %x %x %x %x %x %x %x", rdBuf[0],rdBuf[1],rdBuf[2],rdBuf[3],rdBuf[4],rdBuf[5],rdBuf[6],rdBuf[7],rdBuf[8],rdBuf[9]); MessageBox(szBuf); よろしくお願いします。

  • WriteFileで送信できたかの確認方法は?

    シリアルポートで非同期でバイナリを送信するプログラムを作成しています。 以下のソースでバイナリを送信したつもりなのですが、本当に送信できているのか分りません。 送信が完了したのか確認するにはどうしたいいでしょうか? よろしくお願いします。 COMのオープン、DCBの設定は恐らく問題ないので、 WriteFileの周辺を抜粋します。 OVERLAPPED old; ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = NULL; char wbuf[7] = {0x02,0x0C,0x01,0x00,0x31,0x15,0x1A}; DWORD wbyte; if(!WriteFile(hCom,wbuf,(DWORD)sizeof(wbuf),&wbyte,&old)){ if(ERROR_IO_PENDING == GetLastError()){ GetOverlappedResult(hCom,&old,&wbyte,TRUE); } else MessageBox("エラー"); }

  • バイナリデータの書き方が分かりません・・。

    シリアルポートでバイナリデータを送信したいのですが、バイナリをどう書けがいいのか分りません。 送りたいコードは16進数で02 00 02 00です。 以下のソースの"123"の部分を書き換えるのだと思うのですが、どう書けば良いのでしょうか? よろしくお願いします。 char* wbuf; DWORD wbyte; lstrcpy(wbuf,"123"); WriteFile(hCom,wbuf,lstrlen(wbuf),&wbyte,&old

  • バイナリ送信で出るエラーコードの意味が分かりません

    シリアルポートでバイナリを非同期で送信するプログラムを作成しています。 以下のソースで実行すると、「重複したI/O処理を実行しています」というエラーがでました。 何が間違っているのか分りません・・。 どうかご指摘お願いします。 void CMyDlg::OnReset() { //COMポートオープン HANDLE hCom; hCom = CreateFile( "COM4", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ); //通信設定 DCB dcb; GetCommState(hCom,&dcb); dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(hCom,&dcb); OVERLAPPED old; // オーバーラップ構造体の初期化 ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = NULL; //データ送信 char wbuf[7] = {0x02,0x00,0x01,0x00,0x31,0x15,0x12}; DWORD wbyte; WriteFile(hCom,wbuf,sizeof(wbuf),&wbyte,&old); //エラーコード取得&文字列に変換&表示 LPVOID lpMessageBuffer; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),//エラーコード取得 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL ); MessageBox((LPCTSTR)lpMessageBuffer); //メッセージボックス LocalFree( lpMessageBuffer ); //COMポートクローズ CloseHandle(hCom); }

  • エラーの原因は?「この関数の定義が見つかりません」

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <症状> ヘッダー void Transmit(HANDLE,OVERLAPPED,unsigned char[],DWORD,CString); cppファイル void CMyDlg::Transmit(HANDLE hCom,OVERLAPPED old,unsigned char ucBuf[],DWORD dwByte,CString s) { } とコーディングしていて、ビルドも実行も全く問題ないのですが、 ClassViewでTransmit(HANDLE,OVERLAPPED,unsigned char[],DWORD,CString) をダブルクリックして、関数に移ろうとすると 『この関数の定義(インプリメンテーション)が見つかりません』 というエラーが出ます。 <質問> このエラーは何が原因で出ているのでしょうか?? 宜しければご指摘の程お願い致します。

  • ReadFileについて

    はじめまして。 コマンドラインから実行可能なRS232C通信プログラムを Cで作成しています。 ハイパーターミナルからCOM2に文字を出力して ReadFileで取得した文字列を画面にはき出すというだけの 「Hello,World!」のような簡単なプログラムなのですが ReadFileの動作結果に思うようなものが得られず困っています。 お知恵をお貸しください。 読込結果がおかしいのです。 リターンキー以外は何を入力しても「7F」が返ってきてしまいます (リターンキー入力の場合も正常値ではありません)。 また、入力も無視されたり、認識されたりで動作も不安定です。 ReadFile自体のエラーは発生しません。 よろしくお願いいたします。 Borland C++ Compiler 5.5 Windows2000(実際に動作させたいのはWin95上です) 以下、コードです。 DWORD dwErrors; // エラー情報 COMSTAT ComStat; // デバイスの状態 DWORD dwCount; //受信データのバイト数 DWORD dwRead; // ポートから読み出したバイト数 unsigned char pszBuf[30];// 受信バッファ while(1){  ClearCommError(hComm, &dwErrors, &ComStat);  dwCount = ComStat.cbInQue;  if (0 >= dwCount) continue;  memset(pszBuf,'\0',sizeof(pszBuf));  if (ReadFile(hComm, pszBuf, dwCount, &dwRead, NULL)){   if (dwRead > 0) {    if (pszBuf[0] == '\r') break;    printf("%%s : %s\n",pszBuf);   }else{    break;   }  } }

  • WriteFileのエラー995は何が原因?

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <症状> 以下のコード部分は、これまでエラーは無かったのですが、 他の部分をいろいろといじった結果以下のコードでエラーが出るように なりました。 HANDLE hCom;//COMポートのハンドル OVERLAPPED old;//構造体 unsigned char ucBuf[];//送信する内容 DWORD dwByte;//送信するバイト数 //上記変数は宣言後、正しい値を入れています。 BOOL blRet;//実行結果 if(WriteFile(hCom,ucBuf,dwByte,NULL,&old) == 0){ blRet = GetLastError(); } を実行後、blRetの結果を確認すると995で、 「スレッドが終了したか、またはアプリケーション要求によって、I/O 処理が中止されました。」 が出ました。 <質問> このエラーは何が原因でしょうか? 宜しければご指摘の程よろしくお願いします。