いくら見ても原因がわかりません。。。
誰かわかりますか??
問題のところは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:デバッグをお願いしたいのですが、、、
<メモリが確保されません
というのは指定しているサイズより小さいという意味ですか?
それともアドレスはあるのにメモリ操作等するとエラーになるという意味ですか?
GlobalAlloc関数の戻り値ポインタをsizeofしてますが、ポインタのサイズで常に4が表示されます。
その後のInternetReadFileでもその値を使っているためsizeof(buffer)の箇所を
sizeof(TCHAR)*(dwfSize+1)にする必要があると思われますが、それで解決しないでしょうか?
というのは指定しているサイズより小さいという意味ですか?
それともアドレスはあるのにメモリ操作等するとエラーになるという意味ですか?
GlobalAlloc関数の戻り値ポインタをsizeofしてますが、ポインタのサイズで常に4が表示されます。
その後のInternetReadFileでもその値を使っているためsizeof(buffer)の箇所を
sizeof(TCHAR)*(dwfSize+1)にする必要があると思われますが、それで解決しないでしょうか?
Re:デバッグをお願いしたいのですが、、、
>buffer=(LPTSTR)GlobalAlloc(GPTR,sizeof(TCHAR)*(dwfSize+1));
>if (sizeof(buffer)<dwfSize)
このif文で両者を比較している意味合いは、どういったものですか?
また、「ちゃんと表示されている」というデバッグ情報の内容を示していただけますか?
GlobalAlloc() で確保した領域のサイズと、
その先頭アドレスを格納するポインタ変数のサイズ(こちらは環境によって固定値のはず)
との区別が付いていないように見えます。
>if (sizeof(buffer)<dwfSize)
このif文で両者を比較している意味合いは、どういったものですか?
また、「ちゃんと表示されている」というデバッグ情報の内容を示していただけますか?
GlobalAlloc() で確保した領域のサイズと、
その先頭アドレスを格納するポインタ変数のサイズ(こちらは環境によって固定値のはず)
との区別が付いていないように見えます。
Re:デバッグをお願いしたいのですが、、、
>>ねこサン
>><メモリが確保されません
>>というのは指定しているサイズより小さいという意味ですか?
>>それともアドレスはあるのにメモリ操作等するとエラーになるという意味ですか?
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()ですべての内容を読み込みたいのですが。。。
ファイルサイズは取得できているので、それを使ってメモリを動的に確保、ファイルを読み込む。といったことがしたいのです。
アドバイスをよろしくお願いします。
>><メモリが確保されません
>>というのは指定しているサイズより小さいという意味ですか?
>>それともアドレスはあるのにメモリ操作等するとエラーになるという意味ですか?
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()ですべての内容を読み込みたいのですが。。。
ファイルサイズは取得できているので、それを使ってメモリを動的に確保、ファイルを読み込む。といったことがしたいのです。
アドバイスをよろしくお願いします。