Win98について

解決


あや  2004-05-17 18:20:12  No: 53690

FTP送信するアプリケショーンを作成したのですけど、
Windows98上で実行をおこなうと画面が再描画されな
くなります。
Windows2000では問題無く動作します。
過去ログを見ると、メモリリークとかのお話があるようですが、
根本的な解決策まで書いておりませんでしたので、
投稿しました。

どなたか、このような現象をご存知な方はおりませんか?
よろしくお願い致します。

[現象的
・エディットで表示していたのが表示されない。
・コンボボックスではプルダウンはできるもの
  リストが表示されない。
・ボタンのキャプションが表示されない。

開発環境:Windows2000pro(SP2) + VisualC6.0


Eighty  2004-05-17 20:04:01  No: 53691

リソース不足になったとか。


あや  2004-05-17 20:35:09  No: 53692

Eighty さん
お返事ありがとうございます。
リソース不足で解決方法を
探してたら

この用な記事が

http://support.microsoft.com/default.aspx?scid=kb;ja;171843

winsockがらみのリソース不足ですかね?
1.FtpPutFileでファイル送信します。
2.ファイル送信後にwinsockでFTP接続
3.ファイル一覧(LIST -lR)コマンド送信
4.結果を受信し、表示しております。

1〜4を通して、動作確認すると1回で
上記の現象が起こりますけど・・・
2,3,4をコメントアウトし、1を繰り返し動作させると
上記の現象が起こります。

もう少し調査したいと思います。

何かご存知でしたらアドバイスお願いします。


Eighty  2004-05-17 21:06:04  No: 53693

アクセサリに「リソースメータ」があるので
それ起動して、実行してみては。


あや  2004-05-17 23:52:29  No: 53694

Eighty さん

Windows98にアクセサリの中に「リソースメータ」が
ないです。
しかし、やっぱりリソース問題でした。
ファイル一覧を表示するためのバッファのサイズを
1000000していたのが問題でした・・・。。。
ファイルサイズを小さくしたところ・・・
解消しました。
しかし・・・

-rw-r--r--   1 abc    2030          65 Apr 14  2003 a.txt
-rw-r--r--   1 abc    2030          65 Apr 14  2003 b.txt
-rw-r--r--   1 abc    2030         103 Apr 14  2003 c.txt
-rw-r--r--   1 abc    2030          16 Apr 14  2003 d.txt
-rw-r--r--   1 abc    2030          53 Apr 14  2003 e.txt

入れる場所が小さいと困ります・・・


RiSK  2004-05-18 00:09:44  No: 53695

> Windows98にアクセサリの中に「リソースメータ」が
> ないです。

インストールしましょう。

> ファイル一覧を表示するためのバッファのサイズを
> 1000000していたのが問題でした・・・。。。

スタックに積むのではなく、ヒープから確保してみてはいかがでしょうか?


Eighty  2004-05-18 00:19:24  No: 53696

> Windows98にアクセサリの中に「リソースメータ」が
> ないです。

[スタート]-[プログラム(P)]-[アクセサリ]-[システム ツール]-[リソース メーター]
にないですか?


あや  2004-05-18 01:04:27  No: 53697

Eighty さん
・・・リソースメーターないみたいです。
インストールしていないみたいです。
後日、インストールしますね。

>スタックに積むのではなく、ヒープから確保してみてはいかがでしょうか?

ヒープ?  ちょっとどうのように実現するのかが・・・
すいません。
今、困っているのが・・・

-rw-r--r--   1 abc    2030          65 Apr 14  2003 a.txt
-rw-r--r--   1 abc    2030          65 Apr 14  2003 b.txt

毎回こういう結果が返ってくるなら、難しくないですけど・・・

例えば・・・
-rw-r--r--   1 abc    2030          65 Apr 14  2003 a.txt
-rw-r

こういう結果とか・・・
abc    2030          65 Apr 

とか・・・  返ってくる値がまちまちなので・・・
どのようにリストボックスに表示するのかが
難しく悩んでおります。

以上です。


Eighty  2004-05-18 01:37:28  No: 53698

> ファイル一覧を表示するためのバッファのサイズを
> 1000000していたのが問題でした・・・。。。
> ファイルサイズを小さくしたところ・・・
> 解消しました。
私には、このへん意味不明。
なぜ、ファイルサイズを小さくすると、解消するの。
バッファのサイズを小さくして、解消するなら分かるけど。

どのようにしてファイル一覧を取得して表示しているか、
部分的にソースコードを示してくれると
答えやすいと思います。


あや  2004-05-18 02:09:38  No: 53699

Eighty さん
ご親切にお付き合いどうもありがとうございます。

>バッファのサイズを小さくして、解消するなら分かるけど。

はい。  その通りでございます。w
バッファのサイズを小さくしたところで上記の現象が解消できました。

ソースですか・・・  途中なんですけど・・・
改行ごとにリストボックスに登録しよと
試みてるところですが・・・  
改行コードをどのように取得できるのか
探しております  ^^

  /* ソケットから文字列を受信します */
  /* 受信した文字列は buf に入ります */
  /* 受信する文字列はサーバが送信したものです */
   count = 0;
    i = 0;
  list_count = 0;
  list_first = FALSE;
    lstrcpy(buf_sub, "");
    SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_RESETCONTENT,(WPARAM)0,(LPARAM)0);
    while (1) {
      buf_len = recv(soc, buf, MAX_PATH - 1, 0);
    if (buf_len == SOCKET_ERROR ){
    fprintf(stderr,"サーバからの受信失敗\n");
      shutdown(soc, 2);
      closesocket(soc);
      WSACleanup();
        MessageBox(ahWnd,"FTPセッション(サーバ受信)を確立できませんでした          ","Parameter Error",MB_OK|MB_ICONERROR);
      return(FALSE);  
    }
      if ((buf_len == 0) || (buf_len == -1)) {
        break;
    }
     buf[buf_len] = '\0';  /* 受信したバッファの後ろにNULLを付加する */
    lstrcat(buf_sub, buf);
      i = i + buf_len;

      while (1) {
    i = lstrlen(buf_sub);
        idx = strspn(buf_sub, "\r\n");
        if (i == idx) {
          break;
    } else {
          strncpy(buf, buf_sub, idx);
          idx = strspn( buf, "total" );
          if (idx != 5) {
            idx = strspn( buf, "./");
            if (idx > 1) {
            list_count++;
            SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_INSERTSTRING,(WPARAM)list_count,(LPARAM)"");
      }
            idx = strspn( buf, "d");
            if (idx != 1) {
          list_count++;
             SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_INSERTSTRING,(WPARAM)list_count,(LPARAM)buf);
      }
      }
          strncpy(buf, buf_sub + strspn(buf_sub, "\r\n"), lstrlen(buf_sub));
          lstrcpy(buf_sub, buf);
    }
    }
  }

もう少し調査してみまーす♪


Eighty  2004-05-18 02:41:59  No: 53700

> 改行コードをどのように取得できるのか
サーバーがUNIXなら、改行コードはLFだと思いますが。


Eighty  2004-05-18 04:05:16  No: 53701

> 改行コードをどのように取得できるのか
「改行コードをどのように取得できるのか」ではなく、
「行の途中で切れたときの処理はどうすればいいか?」
という質問ですか?


あや  2004-05-18 05:14:07  No: 53702

Eightyさーん 

返事遅くなって申し訳ございません
御仕事御疲れ様です。(^〇^)v

今までのプログラムが破綻しちゃって・・・
ボロボロで作り直してる最中です・・・涙

改行コードの取得方法がわかりません。。。

-rw-r--r--   1 abc    2030          65 Apr 14  2003 a.txt\r\n
-rw-r--r--   1 abc    2030          65 Apr 14  2003 b.txt\r\n
-rw-r--r--   1 abc    2030          65 Apr 

どのように取り出すのかが、
今までトークンを使っていましたが
3行目の情報が取り出せないので
困っております。

以上です。


RAPT  2004-05-18 08:55:27  No: 53703

> ヒープから。
#define BUFF_SIZE 1024
char *buf = NULL;
buf = new char [BUFF_SIZE];
if(buf == NULL){
    // error: out of memory
}
// (snip)
delete[] buf;

> 改行コード
例えば、以下のようにすれば、改行コードがLFかLF+CRかCRか不明でも、
改行コードの位置を判別可能です。
if(buf[i] == '\n){
    // 改行コード発見
}else if(buf[i] == '\r'){
    if(buf[i+1] == '\n'){
        i++;
    }
    // 改行コード発見
}

> 行の途中で読み込みデータが切れている
もう一つバッファを用意し、そこに溜めておくとか。
次のデータを読み込んだ後、連続データとして処理すればよい。

ちょい面倒なので、イメージだけ。

char buff[400]={0};
size_t offset=0, len=0;

for(;;){
    // 第一引数の位置に第二引数のサイズだけ入力する関数と想定
    ReadData(buff + offset, 400 - offset);

    len=strlen(buff); // 例えば len=200
    if(len==0){
        break;
    }

    // 必要な処理
    // 残ったデータの先頭位置が firstからのオフセットで offset=180とする
    memmove(buff, buff + offset, len - offset);

    offset=len - offset;
    buff[offset]='\0'; // 終端文字を付加
}


RAPT  2004-05-18 08:57:38  No: 53704

ミス修正

> firstからのオフセットで
buffからのオフセットで例えば


あや  2004-05-18 19:08:32  No: 53705

RAPT さん
おはようございます。
できました。
オフセットとか・・・  ヒープとか・・・
ちょっとわからなかったのですけど・・・(^^;
わざわざ夜遅くにレスありがとうございます。
本当に助かりました。
Eightyさん  並びに  RAPTさん
長いお付き合いどうもありがとうございました。

  /* ソケットから文字列を受信します */
  /* 受信した文字列は buf に入ります */
  /* 受信する文字列はサーバが送信したものです */
  intfirst = 0;
  list_count = 0;
    SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_RESETCONTENT,(WPARAM)0,(LPARAM)0);
    while (1) {
      buf_len = recv(soc, buf, MAX_PATH - 1, 0);
    if (buf_len == SOCKET_ERROR ){
    fprintf(stderr,"サーバからの受信失敗\n");
      shutdown(soc, 2);
      closesocket(soc);
      WSACleanup();
        MessageBox(ahWnd,"FTPセッション(サーバ受信)を確立できませんでした          ","Parameter Error",MB_OK|MB_ICONERROR);
      return(FALSE);  
    }
      if ((buf_len == 0) || (buf_len == -1)) {
        break;
    }
     buf[buf_len] = '\0';  /* 受信したバッファの後ろにNULLを付加する */

    i = 0;
    while (buf_len > i) {
    if(buf[i] == '\r'){
          if(buf[i+1] == '\n'){
        i++;
      buf_sub[intfirst] = '\0';
          SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_INSERTSTRING,(WPARAM)list_count,(LPARAM)buf_sub);
            list_count++;
      intfirst = 0;
      }
    } else {
      buf_sub[intfirst] = buf[i];
      intfirst++;
    }
      i++;
    }
  }


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加