mfc-ml

2001年01月

31

[mfc 28243] wave録音時のエラー

はじめまして
初めて投稿します。
環境はwin98でvisual C++ 5.0です。
現在、wave録音、再生するアプリを作っています。
8bitでの録音はうまくいくのですが、16bitでの録音が
うまくいきません。具体的に言うと、16bitで録音し、
データをバッファにためてファイルに落としているのですが
、雑音がひどくて聞けない状態です。ちなみに、バッファに直接
アクセスして聞くとうまくいってました。
これはなぜでしょうか?ファイルに落とすときはfwriteを使って
バッファから落とすようにしています。これがいけないのでしょうか?
どなたか教えてください。

----
ashikawa  a...@limu.is.kyushu-u.ac.jp
31

[mfc 28242] Socketについて

こんばんは
飯田ともうします
環境は WinNT VC6です。

Socketを使ってのプログラムを現在作成しています。
やりたいことは、サーバー側にsend関数で所定のポートにメッセージを送ったら、
サーバー側のエンジンが情報を出し、その情報をrecv関数で受け取ります。

単独での送信・受信はテストは成功しているのですが、あわせて実行すると送信はし
かできません。以下のプログラムの修正点や、こうしたらいいというご意見がありま
したらよろしくお願いします。

//  ソケット接続
void SocketSet(void)
{
 SOCKET fd;      // socket用の変数
 struct sockaddr_in addr;  // socketの情報を代入する構造体
 char ip[256];     // 相手のIPアドレス
 char port[256];     // 相手のport
 WSADATA data;     // Windows Sockets初期化変数
 char msg[256] = "\0";     // ダミーのメッセージデータ
 char tel[256];     // ダミーの電話番号
 char ndata[256];     // 受信データ
 SOCKET fdacp;     // accept時のsocket用の変数
 int response;     // 接続要求の判定変数
 struct hostent *host;    // ホスト名に対するIPアドレスを格納するポインタ
 struct sockaddr_in acp;    // accept時にコピーされる構造体
 char buf[256];     // 得られた内容を入れるバッファ
 int i,len;


 // ソケットを初期化する
 WSAStartup( 0x0101, &data );

 fd = socket( AF_INET, SOCK_STREAM, 0 );
 // ソケットを確保する
 if ( fd == INVALID_SOCKET ){
  perror("socket");
  exit( EXIT_FAILURE );
 }

 // IPアドレスの設定
 sprintf(ip,"aaaa.aaaa.aaaa.aaaa");
 sprintf(port,"1220");

 // ソケットの情報を入れる
 memset( &addr, 0, sizeof( addr ) );  // 構造体addrの初期化
 addr.sin_family = AF_INET;    // AF_INETを指定
 addr.sin_port = htons( atoi(port) );   // ポートを指定
 addr.sin_addr.s_addr = inet_addr( ip ); // IPアドレスの指定

 if( connect( fd, (struct sockaddr *)&addr, sizeof(addr) ) < 0 ){
  perror("connect");
  closesocket( fd );
  exit( EXIT_FAILURE );
 }

 // 送信データ ここでサーバーに情報を渡します
 sprintf(tel,"0123456789");
 sprintf(msg,"http://aaa.aaaa.aaaa/%s",tel);
 send( fd, msg, sizeof( msg ), 0 );

/*
 if( bind( fd, (struct sockaddr *)&addr, sizeof( addr ) ) < 0 ){// バインド
の設定
  perror("bind");
  exit( EXIT_FAILURE );
 }

 // 接続要求に準備する
 if( listen( fd, 1 ) < 0 ){
  perror("connect");
  closesocket( fd );
  exit( EXIT_FAILURE );
 }
*/

 // 受信データ ここでサーバーからの情報を受け取ります
 for(;;){
  len = sizeof( acp );
  if( (fdacp = accept( fd, (struct sockaddr *)&acp, &len)) < 0 ){
   perror("accept");
   closesocket( fd );
   break;
  }
  else{
   // データの受信
   response = recv( fd, buf, sizeof( buf ), 0 );
   for( i=0; i<response; i++ ){
    printf("%c", buf[i] );
   }
   sprintf(ndata, buf);
   closesocket( fdacp );
  }1
 }
}
31

[mfc 28241] Re: Cランタイムライブラリについて

ON MAIL "[mfc 28230] Cランタイムライブラリについて"
(at Wed, 31 Jan 2001 14:50:54 +0900), Yoshiteru Tanaka wrote:
> Cランタイムライブラリについて質問があります。過去の発言をみると、
> ”Exe と DLL が使用するCランタイムライブラリは同一のものである
> 必要があります。”
> とあるのですが、静的リンクする場合も同一でないといけないので
> しょうか?

 基本的に,EXEとDLLでCランタイムを共有するわけではないので,同一である
必要はありません。例外としては,mallocしたメモリをDLLが返し,EXEがそれを
freeする場合で,その場合は両方で“マルチスレッド(DLL)”を選択しなければ
いけません。


> 現在EXE側は、マルチスレッド(dll)、LIB側はマルチスレッドでビルド
> すると、
> ”LINK : warning LNK4098: defaultlib "LIBCMT" は他のライブラリの
> 使用と競合しています; /NODEFAULTLIB:library を使用してください”
> とでてきてしまいます。

 DLLでなくて,LIBファイルなんですね。その場合は,EXEとLIBのすべてのソー
スファイルで利用するランタイムを統一する必要があります。

> LIB側をマルチスレッド(dll)でビルドすると、エラーになってしまうので、
> LIB側のCランタイムライブラリは、変更せずに、このwarningをなくす
> 方法を教えてください。

 “マルチスレッド(DLL)”でビルドするとエラーになるなら,まずはそのエラー
を潰すのが上策だと思いますが…。
 あとは,EXE側を“マルチスレッド”にする方法もあります。MFCを使っている
ようなので,MFC自体をスタティックリンクする必要がありますが。


[大久保 雄介(Okubo Yusuke)]
mailto:y...@246.ne.jp , mailto:y...@ma3.justnet.ne.jp
31

[mfc 28240] Re: カーソルを砂時計に・・

親切な回答ありがとうございます。

> Limです
> if(m_bEnable)と条件を指定しているので、当然といえば当然ですね(^^;

EnableWindow(FALSE)
このFALSEとm_bEnableは違うのです。画面が触れない時m_bEableはTRUEなのです。
(変数名がまぎらわしいですね。これは修正します。)
ですから、m_bEnableがTRUEの間は画面がさわれてもさわれなくても
砂時計になると思ったのですが、ならないのです。


>  CWaitCursor wait;
スコープをぬけるのでこれは使えないのです。
31

[mfc 28239] カーソルを砂時計に2

HTML方式でメールしてしまって下のが化けてしまいました。
申し訳ありません。
もう一度

いつも参考にさせて頂いております。
過去のログもみたのですが、
カーソルを砂時計にするのに
BOOL CXXView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
    if(m_bEnable)
     {
      SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
      return FALSE;
     }
     return CSOPView::OnSetCursor(pWnd, nHitTest, message);
}
という様なコーディングをしております。
が、画面をEnableWindow(FALSE)にすると
砂時計が矢印になってしまいます。
どなたか、この回避方法を教えて頂けないでしょうか。
宜しくお願いします。

ちなみに、メンバ関数をぬけてしばらくWaitするので、CWaitCursorは
使えないのです。(T_T
記事検索
Amazon.co.jp
  • ライブドアブログ