デバッグをお願いしたいのですが、、、

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
...

デバッグをお願いしたいのですが、、、

#1

投稿記事 by ... » 16年前

いくら見ても原因がわかりません。。。
誰かわかりますか??
問題のところはGlobalAlloc()のところです。
デバッグ情報ではちゃんと表示されているし、NULLでもないのにメモリが確保されません。

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <wininet.h>
#define Enterstop while(1){if (getch()==13) break;}

int main (void)
{
//Variable declaration
HINTERNET hInet,shFile;
LPTSTR buffer;
DWORD dwFree,dwfSize;
HANDLE dhFile;

//Open the URL
hInet=InternetOpen(
"Rewrite",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0
);
shFile=InternetOpenUrl(
hInet,
"http://space.geocities.jp/classcircle/rewrite/mylib.c",
NULL,
0,
INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_RELOAD,
0
);

//Get file size
dwFree=sizeof(dwfSize);
HttpQueryInfo(
shFile,
HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER,
&dwfSize,
&dwFree,
0
);

//Secure memories & Load file of Internet
buffer=(LPTSTR)GlobalAlloc(GPTR,sizeof(TCHAR)*(dwfSize+1));
if (sizeof(buffer)<dwfSize)
{
printf("Error %d\n",GetLastError());
printf("Failed secure memories.\n");
if (buffer==NULL) printf("buffer==NULL\n");
printf("dwfSize:sizeof(buffer) = %d:%d\n",dwfSize,sizeof(buffer));
printf("sizeof(LPTSTR) = %d\n",sizeof(LPTSTR));
printf("sizeof(TCHAR)*(dwfSize+1) = %d\n",sizeof(TCHAR)*(dwfSize+1));
Enterstop;
return 1;
}
InternetReadFile(
shFile,
buffer,
sizeof(buffer),
&dwFree
);

//Write to file of local
dhFile=CreateFile(
"\\MyFolder\\Borland\\MyLibrary\\mylib.c",
GENERIC_WRITE,
0,
0,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
WriteFile(dhFile,buffer,sizeof(buffer),&dwFree,NULL);

//Showing user the file
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),buffer,sizeof(buffer),&dwFree,NULL);
printf("\ndwfSize = %d",dwfSize);

//The disposal of end
InternetCloseHandle(shFile);
InternetCloseHandle(hInet);
CloseHandle(dhFile);
GlobalFree(buffer);
Enterstop;
return 0;
}

ねこ

Re:デバッグをお願いしたいのですが、、、

#2

投稿記事 by ねこ » 16年前

<メモリが確保されません
というのは指定しているサイズより小さいという意味ですか?
それともアドレスはあるのにメモリ操作等するとエラーになるという意味ですか?

GlobalAlloc関数の戻り値ポインタをsizeofしてますが、ポインタのサイズで常に4が表示されます。
その後のInternetReadFileでもその値を使っているためsizeof(buffer)の箇所を
sizeof(TCHAR)*(dwfSize+1)にする必要があると思われますが、それで解決しないでしょうか?

box

Re:デバッグをお願いしたいのですが、、、

#3

投稿記事 by box » 16年前

>buffer=(LPTSTR)GlobalAlloc(GPTR,sizeof(TCHAR)*(dwfSize+1));
>if (sizeof(buffer)<dwfSize)

このif文で両者を比較している意味合いは、どういったものですか?

また、「ちゃんと表示されている」というデバッグ情報の内容を示していただけますか?

GlobalAlloc() で確保した領域のサイズと、
その先頭アドレスを格納するポインタ変数のサイズ(こちらは環境によって固定値のはず)
との区別が付いていないように見えます。

...

Re:デバッグをお願いしたいのですが、、、

#4

投稿記事 by ... » 16年前

>>ねこサン
>><メモリが確保されません
>>というのは指定しているサイズより小さいという意味ですか?
>>それともアドレスはあるのにメモリ操作等するとエラーになるという意味ですか?
InternetReadFile()で4バイトしか読み込めてないということです。

>>boxサン
デバッグ情報は
Error 0
Failed secure memories.
dwfSize:sizeof(buffer) = 6496:4
sizeof(LPTSTR) = 4
sizeof(TCHAR)*(dwfSize+1) = 6497
↑こんな感じです。

>>GlobalAlloc() で確保した領域のサイズと、
>>その先頭アドレスを格納するポインタ変数のサイズ(こちらは環境によって固定値のはず)
>>との区別が付いていないように見えます。
そうみたいです。申し訳ありません。


改めて、問題点はInternetReadFile()で4文字しか読み込みがされていない。ということです。
これはLPTSTR型の変数のサイズなのでメモリが確保されてないと思ったのですが違うみたいですね。
とりあえずInternetReadFile()ですべての内容を読み込みたいのですが。。。
ファイルサイズは取得できているので、それを使ってメモリを動的に確保、ファイルを読み込む。といったことがしたいのです。
アドバイスをよろしくお願いします。

...

Re:デバッグをお願いしたいのですが、、、

#5

投稿記事 by ... » 16年前

申し訳ありません。
ねこサンのアドバイスをよく読んだら解決いたしました。
二人ともありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る