ページ 1 / 1
アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 00:50
by たろう
プログラムであるアーカイブファイルを解凍してメモリーに保持することは可能でしょうか?
また出きるのなら、どういう風にプログラムすればよいのでしょうか?アーカイブファイルを解凍してメモリーに保持
する関数はあるのでしょうか?
それとどうやったらそのメモリに保持した画像データやテキストデータを使うことが出来るのでしょうか?(関数があ
るのでしょうか?)
環境はVC++2005
よろしくお願いします。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 01:15
by ベリ工
昔私も同じ事を考え、いろいろ思考錯誤した結果、
zlib(詳細はネットで検索して下さい)という圧縮解凍する
ライブラリをファイルIOが発生しないメモリ上のみで
圧縮解凍できるように自分で改造しました。そのようなメモリ上で
圧縮解凍する関数等は見つかりませんでしたので・・・もしかしたら
見落としていただけかもしれませんが、改造にそこそこ苦労した
記憶があります。
なので、少なくともzlibというライブラリを自分でメモリ上で
圧縮解凍できるように改造すればできます。
参考までに。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 01:21
by ベリ工
あ、ちょっと違いました。私が改造したのは
メモリ上のバイナリデータをファイルIO無しに
メモリ上で圧縮解凍する関数を自作したと言う意味です。
なのでたろうさんの意図する"ファイルから"では無いですが、
メモリ上のバイナリデータをメモリ上で圧縮解凍できるので
問題なくできるでしょう。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 09:47
by softya
解凍ライブラリを自分で作るか、既存のライブラリをうまく使って処理する必要があります。C言語の標準ライブラリにはありません。また、ZIP解凍はWin32APIとして公開されていない様です。
こちらが開発関係の有名サイトです。
http://www.csdinc.co.jp/archiver/
ライブラリを使う場合は、各ライブラリのライセンスをよく読んでください。
>それとどうやったらそのメモリに保持した画像データやテキストデータを使うことが出来るのでしょうか?(関数があるのでしょうか?)
それぞれのAPIやライブラリ別に方法が必要でモノによっては非常に面倒ですが、Win32API/MFC/.NET FrameWork/DirectX/DXライブラリで手法が違います。
解凍以前に、メモリにロードした画像やテキストを扱う方法を勉強されることをお勧めします。

Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 18:48
by たろう
ベリエさん回答ありがとうございます。
できることはできるんですね。
ありがとうございます。
softyaさん回答ありがとうございます。
>解凍以前に、メモリにロードした画像やテキストを扱う方法を勉強されることをお勧めします。
とは何を勉強すればよいのでしょうか?
勉強不足ですみません。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 19:09
by softya
>>解凍以前に、メモリにロードした画像やテキストを扱う方法を勉強されることをお勧めします。
>とは何を勉強すればよいのでしょうか?
画像イメージファイルのバイナリ・ファイル入力でのメモリへ読み込みやテキストのファイル入出力などをC言語で行うことです。
例えば、画像イメージファイルをDXライブラリで扱う場合だと
画像イメージファイルをまずmalloc等で割り当てたメモリに読み込んでから、CreateGraphFromMem()でグラフィックハンドルを得て表示出来る事を確認して見てください。
http://homepage2.nifty.com/natupaji/DxL ... tml#R15N26
テキストならプログラムでテキストファイルを作成したり、テキストファイルを読み込んで内容のテキストを画面に表示したりしてみてください。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 21:24
by たろう
回答ありがとうございます。
>テキストならプログラムでテキストファイルを作成したり、テキストファイルを読み込んで内容のテキストを>画面に表示したりしてみてください。
とは、fopen関数を使ってやると言うことでしょうか?
だとしたら、アーカイブファイルを解凍してメモリ上にテキストで読み込むときどうすればよいのでしょうか?
なにか勘違いしていたらすみません。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 21:50
by softya
>とは、fopen関数を使ってやると言うことでしょうか?
そう言う事です。
>だとしたら、アーカイブファイルを解凍してメモリ上にテキストで読み込むときどうすればよいのでしょうか?
>なにか勘違いしていたらすみません。
アーカイブ以前に普通のファイルでこれが出来ないとアーカイブを扱うことは困難です。
一歩一歩理解してください。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 22:03
by たろう
回答ありがとうございます。fopen()は普通にファイルの書き込みや読み込みはできてるつもりではいるのですが。引数1にファイル名を指定して引数2にファイルオープンモードを指定する。と言うのはわかるのですが、これでは駄目という事でしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 22:26
by softya
>回答ありがとうございます。fopen()は普通にファイルの書き込みや読み込みはできてるつもりではいるのですが。引数1にファイル名を指定して引数2にファイルオープンモードを指定する。と言うのはわかるのですが、これでは駄目という事でしょうか?
それで構いません。
テキストファイルを読み込んで表示するプログラムが作れますか?
ただしテキストサイズは不定です。
これがレベル1です。
次のレベル2は、
不定サイズのテキストファイルを復数読み込むプログラムを作ることは出来ますか?
全てのファイル名とファイル・サイズは、何らから方法で与えられるとします。
ファイルの読み込むメモリは、mallocを使って確保してください。
ファイル数も不定なので、メモリに読み込まれたファイルを管理するリスト構造なども必要です。
数が決め打ちの配列を使うことは出来ません。
この前提でプログラムが作れるならレベル2をクリアです。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 23:34
by たろう
レベル1はできるのですが、
>全てのファイル名とファイル・サイズは、何らから方法で与えられるとします。
ファイル名はどうやって調べればよいのでしょうか?
>ファイル数も不定なので、メモリに読み込まれたファイルを管理するリスト構造なども必要です。
リスト構造は何を入れればいいのでしょうか?
初歩的な質問ですみません。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月25日(火) 23:50
by softya
>>全てのファイル名とファイル・サイズは、何らから方法で与えられるとします。
>ファイル名はどうやって調べればよいのでしょうか?
テキストで与えられても良いですし、Win32APIのFindFirstFile(),FindNextFile()でディレクトリ中からテキストだけ抽出しても良いです。
http://msdn.microsoft.com/ja-jp/library/cc429233.aspx
>>ファイル数も不定なので、メモリに読み込まれたファイルを管理するリスト構造なども必要です。
>リスト構造は何を入れればいいのでしょうか?
ファイル名
サイズ
読み込みメモリのアドレス
は最低限必要です。
後は、リスト構造の管理に必要な情報ですね。アルゴリズムの基本通りです。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月26日(水) 03:34
by たろう
回答ありがとうございます。
読み込みメモリのアドレスはどうやって調べればよいのでしょうか?
以下はできたプログラムです。
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260
typedef struct {
char FileName[MAX_PATH];
long long int size;
unsigned int memoryAddress;
int ftCreateTimeYear;
int ftCreatetimeMonth;
int ftCreatetimeday;
}FILEDATA;
int main(void)
{
FILE *fp;
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
FILEDATA filedata;
SYSTEMTIME systemTime;
int size;
char* str;
int i=0;
hFind=FindFirstFile("*.txt",&FindFileData);
do
{
fp=fopen(FindFileData.cFileName,"r");
strcpy(filedata.FileName,FindFileData.cFileName);
filedata.size=(FindFileData.nFileSizeHigh <<32)+ FindFileData.nFileSizeLow;
FileTimeToSystemTime(&FindFileData.ftCreationTime,&systemTime);
filedata.ftCreateTimeYear=systemTime.wYear;
filedata.ftCreatetimeMonth=systemTime.wMonth;
filedata.ftCreatetimeday=systemTime.wDay;
printf("%s %lld %d %d %d\n",filedata.FileName,filedata.size,
filedata.ftCreateTimeYear,filedata.ftCreatetimeMonth,filedata.ftCreatetimeday);
fseek(fp,0,SEEK_END);
size=ftell(fp);
fseek(fp,0,SEEK_SET);
str=(char*)malloc((size_t)(size));
for(i=0;i<size;i++)
{
if((str=fgetc(fp))=='\n')
size--;
}
str='\0';
printf("%s",str);
free(str);
fclose(fp);
}while(FindNextFile(hFind,&FindFileData) );
printf("\n");
FindClose(hFind);
return 0;
}
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月26日(水) 11:11
by softya
拝見しました。色々と問題あります。
1.リスト構造を理解されていると思えません。
http://www.geocities.jp/ky_webid/algorithm/010.html
2.ファイルサイズを得るときのデータ型が違います。
64bitの整数型の処理が必要です。
3.メモリアドレスはポインタで良いです。
mallocしたポインタをそのまま保存してください。
それにすぐfree()したのでは意味がありません。
4.取り込んだデータの\nの置換えはしなくて良いです。fgetcでは無く、freadを使ってください。
それにすぐ内容表示してますが、次のようなプログラムに書き換えてみてください。
(a)全テキストファイルをメモリに取り込む
(b)テキストファイル名の一覧を表示
(c)入力されたファイル名の内容を表示して、また(b)に戻る。
(d)endが入力されたら、全メモリを解放して終了
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月26日(水) 16:01
by たろう
回答ありがとうございます。
>(a)全テキストファイルをメモリに取り込む
とはどのようにしたらいいのでしょうか?
各テキストファイルの文字列数の合計がわからないのにどうやって保持すればよいのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月26日(水) 16:11
by softya
>各テキストファイルの文字列数の合計がわからないのにどうやって保持すればよいのでしょうか?
ファイルサイズは分かっているので、そのまま読み込めば良いだけですよ。
文字列として扱う必要があるのはテキスト表示する時だけですので、その時に\nを文字列の終端として扱ってやればい良いことになります。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月26日(水) 19:01
by たろう
返信ありがとうございます。
わからなくなったので質問します。
このソースで実行したら、ここの部分で処理が止まってしまいました。
どうしてでしょうか?
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260
#define MAX_TEXT 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
char* str;
unsigned long long int size;
unsigned int memoryAddress;
int ftCreateTimeYear;
int ftCreatetimeMonth;
int ftCreatetimeday;
struct _tagfiledata* nextnode;
}FILEDATA;
int main(void)
{
FILE *fp;
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata,*nextdata;
SYSTEMTIME systemTime;
long long int size;
int i=0;
filedata= (FILEDATA*)malloc((size_t)sizeof(FILEDATA));
nextdata=filedata;
hFind=FindFirstFile("*.txt",&FindFileData);
fp=fopen(FindFileData.cFileName,"rb");
fseek(fp,0,SEEK_END);
size=ftell(fp);
fseek(fp,0,SEEK_SET);
nextdata= (FILEDATA*)malloc((size_t)(sizeof(FILEDATA)));
nextdata->str= (char*)malloc((size_t)(size));
fread(nextdata->str,size,1,fp);
nextdata=nextdata->nextnode;
fp=fopen(FindFileData.cFileName,"rb");
strcpy(filedata->FileName,FindFileData.cFileName);
while(FindNextFile(hFind,&FindFileData))
{
fp=fopen(FindFileData.cFileName,"rb");
strcpy(filedata->FileName,FindFileData.cFileName);
printf("%s\n",filedata->FileName);
fseek(fp,0,SEEK_END);
size=ftell(fp);
fseek(fp,0,SEEK_SET);
nextdata=(FILEDATA*)realloc(nextdata,(size_t)sizeof(FILEDATA));<===ここ
nextdata->str=(char*)realloc(nextdata->str,(size_t)(size));
fread(nextdata->str,size,1,fp);
nextdata=nextdata->nextnode;
fclose(fp);
}
printf("\n");
FindClose(hFind);
fclose(fp);
nextdata=filedata;
hFind=FindFirstFile("*.txt",&FindFileData);
do{
fp=fopen(FindFileData.cFileName,"rb");
printf("%s",FindFileData.cFileName);
printf("%s",nextdata->str);
nextdata=nextdata->nextnode;
fclose(fp);
}while(FindNextFile(hFind,&FindFileData) );
printf("\n");
free(filedata->str);
FindClose(hFind);
return 0;
}
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月26日(水) 20:09
by softya
えーと、読みづらいのでコメントを入れてくださいね。
理由は、nextdataに不正な値が入っているためです。
根本的な問題はリスト構造の作り方が間違っているためで、realloc()は出来くるはずが無いのですが見直してみてください。
それとFindFirstFile()とFindNextFile()のあとファイル処理は共通化出来るので関数に分離してみてください。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月27日(木) 00:45
by たろう
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
char* str;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(char* str,FILEDATA* nextdata);
int main(void)
{
FILE *fp;
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
SYSTEMTIME systemTime;
long long int size;
hFind=FindFirstFile("*.txt",&FindFileData);
//データを取得する
Filedatasyutoku(FindFileData.cFileName,filedata);
nextdata=filedata;
while(FindNextFile(hFind,&FindFileData))
{
//データを取得する
Filedatasyutoku(FindFileData.cFileName,nextdata);
}
nextdata=NULL;
printf("\n");
FindClose(hFind);
nextdata=filedata;
while(nextdata!=NULL ){
//表示する
printf("%s",nextdata->FileName);
printf("%s",nextdata->str);
nextdata=nextdata->nextnode;
}
printf("\n");
//free(filedata->str);
return 0;
}
void Filedatasyutoku(char* str,FILEDATA* nextdata)
{
FILE *fp;
int size;
//ファイルを開く
fp=fopen(str,"rb");
fseek(fp,0,SEEK_END);
//データのサイズを取得する
size=ftell(fp);
fseek(fp,0,SEEK_SET);
//メモリーを確保
nextdata=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
nextdata->str=(char*)malloc((size_t)(size));
//構造体にデータを入れる
strcpy(nextdata->FileName,str);
fread(nextdata->str,size,1,fp);
nextdata=nextdata->nextnode;
fclose(fp);
}
とやったのですが、
データが取得されないですが、
これはポインタが理解していないのでしょうか。
どこを直せばいいのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月27日(木) 16:58
by softya
このプログラムってデバッガでトレースしてみましたか?
デバッガを使いないとちょっとした問題でも何時間でも悩むことになるので、デバッガを使うようにしてください。
問題点は幾つかあります。
・Filedatasyutoku()はnextdataでポインタデータを返すことが出来ません。
値渡しとポインタによる擬似参照渡しの違いを理解する必要がります。
ポインタの引数については、こちらの「ポインタ その3」を見てください。
http://chaichan.web.infoseek.co.jp/src/c.htm
・問題と言うほどでも無いですが、将来的なことも考えて
Filedatasyutoku()の引数のstrはfilenameとか意味を持つ名前にしてください。
filename_strでも良いです。nextdata->strと混乱を招きます。
・初期化されていないポインタの利用。Filedatasyutoku()中のnextdata=nextdata->nextnode;の部分ですが、nextdata->nextnodeは値が未定義ですので、nextdataは不定なポインタになります。
リスト構造のリストポインタのつもりだと思いますが、有効なデータ同士をリストすることに意味があるのであって未定・不定なポインタを結合しては行けません。
・main中のnextdata=NULL;は使い方が間違っています。
これもポインタの使い方の間違いですので、よく読んでみてください。
http://chaichan.web.infoseek.co.jp/src/c.htm
デバッガで変数をウォッチしてみるのも良い勉強になります。
・メモリのfree()が無くなってますね。
表示するのと処理が出来るならfree()出来ると思いますので挑戦してみてください。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月27日(木) 18:48
by たろう
参考のサイトありがとうございます。
しかしそれは理解しているつもりの内容なのですが、
ダブルポインタでやるのはわかったのですがそれで試行錯誤してやっていったのですが、
できないというか、わかりません。何がいけないのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月27日(木) 19:01
by softya
>ダブルポインタでやるのはわかったのですがそれで試行錯誤してやっていったのですが、
もし呼び出した関数の方でポインタの値を書き換えたいなら、ポインタのポインタを関数に渡す必要がありあます。現状のソースコードは、単純なポインタしか渡していませんよね。
ところで、ちゃんとデバッガでポインタの値などを確認してトレースしてますか?
ダブルポインタの基本的な書き方
int main()
{
FILEDATA *pdata;
func(&pdata);
}
void func(FILEDATA **ppdata) {
*ppdata = malloc( sizeof(FILEDATA) );
}
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月27日(木) 19:14
by たろう
確認しました。
やっぱり、リストが結合されていませんでした。
アドレスがNULLのままで返ってきます。
リストを結合するにはどうすればよいのでしょうか?
以下はソースです
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260
#define MAX_TEXT 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
char* str;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(char* str,FILEDATA** nextdata);
int main(void)
{
FILE *fp;
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
SYSTEMTIME systemTime;
long long int size;
hFind=FindFirstFile("*.txt",&FindFileData);
nextdata=filedata;
Filedatasyutoku(FindFileData.cFileName,&nextdata);
while(FindNextFile(hFind,&FindFileData))
{
Filedatasyutoku(FindFileData.cFileName,&nextdata);
}
printf("\n");
FindClose(hFind);
nextdata=filedata;
while(nextdata!=NULL ){
printf("%s",nextdata->FileName);
printf("%s",nextdata->str);
nextdata=nextdata->nextnode;
}
printf("\n");
nextdata=filedata;
while(nextdata!=NULL)
{
free(nextdata->str);
free(nextdata);
}
return 0;
}
void Filedatasyutoku(char* str,FILEDATA** nextdata)
{
FILE *fp;
int size;
//ファイルを開く
fp=fopen(str,"rb");
fseek(fp,0,SEEK_END);
//データのサイズを取得する
size=ftell(fp);
fseek(fp,0,SEEK_SET);
//メモリーを確保
*nextdata=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
(*nextdata)->str=(char*)malloc((size_t)(size));
//構造体にデータを入れる
strcpy((*nextdata)->FileName,str);
fread((*nextdata)->str,size,1,fp);
(*nextdata)=(*nextdata)->nextnode;
(*nextdata)=NULL;
fclose(fp);
}
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月27日(木) 19:28
by softya
根本的な問題は、メモリ割り当て時に後方に対してリスト結合を行おうとしてますが、後方のリストは存在しないので結合出来るはずがありません、後方のリストは基本的に無効なのでNULLを代入すべきです。
じゃあ、どうするかと言うとメモリ割り当て時に前方のリストに結合します。1つ手前のリストのポインタと今のリストのポインタをどう管理するか考えてみてください。
※ヒント
1.Filedatasyutoku()の引数は変更する必要はありません。
2.main側でも、Filedatasyutoku()側でも前方リストへの結合は可能です。自分に分かる方法を選んでください。
3.絵に書いてみるとイメージが掴みやすいです。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月27日(木) 20:04
by たろう
できました!
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260
#define MAX_TEXT 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
char* str;
struct _tagfiledata* prevnode;
struct _tagfiledata* nextnode;
}FILEDATA;
FILEDATA* Filedatasyutoku(char* str,FILEDATA** nextdata);
int main(void)
{
FILE *fp;
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
SYSTEMTIME systemTime;
long long int size;
hFind=FindFirstFile("*.txt",&FindFileData);
filedata=Filedatasyutoku(FindFileData.cFileName,&filedata);
while(FindNextFile(hFind,&FindFileData))
{
filedata=Filedatasyutoku(FindFileData.cFileName,&filedata);
}
FindClose(hFind);
nextdata=filedata;
while(nextdata!=NULL ){
printf("%s",nextdata->FileName);
printf("\n");
printf("%s",nextdata->str);
printf("\n");
nextdata=nextdata->nextnode;
}
printf("\n");
/* filedata;
while(filedata!=NULL)
{
free(filedata->str);
free(nextdata);
}*/
return 0;
}
FILEDATA* Filedatasyutoku(char* str,FILEDATA** nextdata)
{
FILE *fp;
int size;
FILEDATA* prev;
//ファイルを開く
fp=fopen(str,"r");
fseek(fp,0,SEEK_END);
//データのサイズを取得する
size=ftell(fp);
fseek(fp,0,SEEK_SET);
//メモリーを確保
prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
prev->str=(char*)malloc((size_t)(size));
prev->nextnode=(*nextdata);
//構造体にデータを入れる
strcpy(prev->FileName,str);
fread(prev->str,size,1,fp);
fclose(fp);
return prev;
}
ただ、文字化けが出てくるのですが、
たとえば、
テキストファイルに
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
と入力してあるのに、結果は
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa□□□□ンン)
と出ますこれはどうしたらよいのでしょうか?
よろしくお願いします。
aaaaaaaaaaa
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月27日(木) 22:53
by softya
あっ、それは言い忘れてました。
メモリに保存されているのはテキストは文字列の終端コードがありませんので、そのまま出力するとマズイことになります。1文字づつテキストファイルのサイズ文だけ出力する必要があります。よく見たらテキストファイルのサイズが構造体から無くなってますね。まず構造体にサイズを追加してください。
それとメモリの解放が出来ていません。辿り方は表示する時と同じです。
ただ、何も考えずに解放すると後方のリストのポインタの処理に問題が出ますので注意してください。
それと、一番大きな問題はリスト処理に間違いがあります。3つ以上のテキストファイルを用意してみると分かりますよ。
ヒント
・後方のリストは基本的に無効なので NULLを代入すべきです。 と言ったはずですが守ってますか?
・全部のリストのポインタを確認しましたか?リスト自体のアドレスとnextnodeの指すアドレスを確認してください。
・双方向リストは作っていないので、prevnodeは不要です。と言うか使っていませんし。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月27日(木) 23:46
by たろう
返信ありがとうございます。
>後方のリストは基本的に無効なので NULLを代入すべきです。 と言ったはずですが守ってますか?
できていると思うのですが、このfiledataが一番後ろの部分なので宣言のところにNULLと入れてます。
>全部のリストのポインタを確認しましたか?リスト自体のアドレスとnextnodeの指すアドレスを確認してください。
確認しました。合ってました。
>双方向リストは作っていないので、prevnodeは不要です。と言うか使っていませんし。
すみません。消すの忘れてました。
プログラムできたので見てください。
>それと、一番大きな問題はリスト処理に間違いがあります。3つ以上のテキストファイルを用意してみると分かりますよ
3つ以上のテキストファイルを用意しましたが、変化はありませんでした。(全部のリストちゃんと表示されました。)
何が間違ってしるのでしょうか?
以下変更したソース載せます。
[/pre]#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
char* str;
long long int size;
struct _tagfiledata* memoryAddress;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(char* str,FILEDATA** nextdata);
int main(void)
{
FILE *fp;
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
SYSTEMTIME systemTime;
hFind=FindFirstFile("*.txt",&FindFileData);
Filedatasyutoku(FindFileData.cFileName,&filedata);
while(FindNextFile(hFind,&FindFileData))
{
Filedatasyutoku(FindFileData.cFileName,&filedata);
}
FindClose(hFind);
nextdata=filedata;
while(nextdata!=NULL ){
printf("%s",nextdata->FileName);
printf("\n");
printf("%p",nextdata->memoryAddress);
printf("\n");
for(int i=0;i<nextdata->size;i++)
{
if(nextdata->str=='\n')
nextdata->size--;
printf("%c",nextdata->str);
}
printf("\n");
nextdata=nextdata->nextnode;
}
printf("\n");
nextdata=filedata;
while(filedata!=NULL)
{
nextdata=filedata->nextnode;
free(filedata->str);
free(filedata);
filedata=nextdata;
}
return 0;
}
void Filedatasyutoku(char* str,FILEDATA** nextdata)
{
FILE *fp;
int size;
FILEDATA* prev;
//ファイルを開く
fp=fopen(str,"rb");
fseek(fp,0,SEEK_END);
//データのサイズを取得する
size=ftell(fp);
fseek(fp,0,SEEK_SET);
//メモリーを確保
prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
prev->str=(char*)malloc((size_t)(size));
prev->size=size;
prev->memoryAddress=prev;
prev->nextnode=(*nextdata);
(*nextdata)=prev;
//構造体にデータを入れる
strcpy(prev->FileName,str);
fread(prev->str,size,1,fp);
fclose(fp);
}[/pre]
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月28日(金) 00:10
by softya
>何が間違ってしるのでしょうか?
ごめなさい勘違いしてましたね。後ろから前にリストを作っているんですね。で、最後のがリスト先頭になるって事ですね。いや、全然OKです。
削除も有ってますが、これは不要では?
nextdata=filedata; ← これ
while(filedata!=NULL)
{
nextdata=filedata->nextnode;
free(filedata->str);
free(filedata);
filedata=nextdata;
}
じゃあ、まずLZHファイルの解凍処理に挑戦してみましょうか。
復数のテキストの入ったLZHファイルを用意してください。
ライブラリはこれ。
http://www2.nsknet.or.jp/~micco/mysoft/unlha32.htm
基本的な使い方はこれ
http://www13.plala.or.jp/kmaeda/winc/lzhtxt.htm
で、今回の目的に使用する関数はこれです。
UnlhaFindFirst
UnlhaFindNext
UnlhaExtractMem
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月28日(金) 16:02
by たろう
返信ありがとうございます。
実行中エラーがでてどこを直せばよいのかわかりません。
ここの所で、「既にUNLHA32.DLLは動作中です」と出ます。どこが間違っているのでしょうか?
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
#define MAX_PATH 260
#define MAX_TEXT 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
char* str;
long long int size;
struct _tagfiledata* memoryAddress;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(char* str,FILEDATA** nextdata);
int main(void)
{
HWND hWnd;
FILE *fp;
char str[512];
unsigned char buffer;
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
HARC hArc;
INDIVIDUALINFO ii;
hWnd=NULL;
char* filename;
hArc = UnlhaOpenArchive(hWnd, "圧縮ファイル.lzh", M_ERROR_MESSAGE_ON);
strcpy(str,"圧縮ファイル.lzh");
if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
do {
strcpy(str,"圧縮ファイル.lzh c: ");
strcat(str,ii.szFileName);
UnlhaExtractMem(hWnd,str,&buffer,512,NULL,NULL,NULL);<==ここ
Filedatasyutoku(ii.szFileName,&filedata);
} while (UnlhaFindNext(hArc, &ii) != -1);
}
UnlhaCloseArchive(hArc);
nextdata=filedata;
while(nextdata!=NULL ){
printf("%s",nextdata->FileName);
printf("\n");
printf("%p",nextdata->memoryAddress);
printf("\n");
for(int i=0;i<nextdata->size;i++)
{
if(nextdata->str=='\n')
nextdata->size--;
printf("%c",nextdata->str);
}
printf("\n");
printf("\n");
nextdata=nextdata->nextnode;
}
printf("\n");
while(filedata!=NULL)
{
nextdata=filedata->nextnode;
free(filedata->str);
free(filedata);
filedata=nextdata;
}
return 0;
}
void Filedatasyutoku(char* file_str,FILEDATA** nextdata)
{
FILE *fp;
int size;
FILEDATA* prev;
//ファイルを開く
fp=fopen(file_str,"rb");
if(fp==NULL){
exit(1);
}
fseek(fp,0,SEEK_END);
//データのサイズを取得する
size=ftell(fp);
fseek(fp,0,SEEK_SET);
//メモリーを確保
prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
prev->str=(char*)malloc((size_t)(size));
prev->size=size;
prev->memoryAddress=prev;
prev->nextnode=(*nextdata);
(*nextdata)=prev;
//構造体にデータを入れる
strcpy(prev->FileName,file_str);
fread(prev->str,size,1,fp);
fclose(fp);
}
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月28日(金) 16:19
by たろう
あと、このサイトに「UNLHA32.LIB はボーランド C++ 用なので間違えないようにして下さい。」
と載っていたのですが、VC++2005では使えないのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月28日(金) 18:16
by たろう
変更しました。
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
#define MAX_PATH 260
#define MAX_TEXT 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
char* str;
long long int size;
struct _tagfiledata* memoryAddress;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(char* str,FILEDATA** nextdata);
int main(void)
{
HWND hWnd=0;
FILE *fp;
char full_file_str[512];
unsigned char buffer;
int i=0;
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
HARC hArc;
INDIVIDUALINFO ii;
hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON);
if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
do {
strcpy(full_file_str,"test.lzh c:");
strcat(full_file_str,ii.szFileName);
Filedatasyutoku(full_file_str,&filedata);
} while (UnlhaFindNext(hArc, &ii) != -1);
}
UnlhaCloseArchive(hArc);
UnlhaExtractMem(hWnd,full_file_str,&buffer,512,NULL,NULL,NULL);
nextdata=filedata;
while(nextdata!=NULL ){
printf("%s",nextdata->FileName);
printf("\n");
printf("%p",nextdata->memoryAddress);
printf("\n");
for(int i=0;i<nextdata->size;i++)
{
if(nextdata->str=='\n')
nextdata->size--;
printf("%c",nextdata->str);
}
printf("\n");
printf("\n");
nextdata=nextdata->nextnode;
}
printf("\n");
while(filedata!=NULL)
{
nextdata=filedata->nextnode;
free(filedata->str);
free(filedata);
filedata=nextdata;
}
return 0;
}
void Filedatasyutoku(char* file_str,FILEDATA** nextdata)
{
FILE *fp;
int size;
FILEDATA* prev;
//ファイルを開く
fp=fopen(file_str,"rb");
if(fp==NULL){
exit(1);
}
fseek(fp,0,SEEK_END);
//データのサイズを取得する
size=ftell(fp);
fseek(fp,0,SEEK_SET);
//メモリーを確保
prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
prev->str=(char*)malloc((size_t)(size));
prev->size=size;
prev->memoryAddress=prev;
prev->nextnode=(*nextdata);
(*nextdata)=prev;
//構造体にデータを入れる
strcpy(prev->FileName,file_str);
fread(prev->str,size,1,fp);
fclose(fp);
}
とやったのですが、
ファイルが開きません。exit(1)のところで出てしまいます。
どのようにしたら開くことができるのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月28日(金) 19:13
by softya
>あと、このサイトに「UNLHA32.LIB はボーランド C++ 用なので間違えないようにして下さい。」
>と載っていたのですが、VC++2005では使えないのでしょうか?
ドキュメントに
UNLHA32.LIB : VC++ でコンパイルするためのインポートライブラリです。
と書いてあるので大丈夫ですよ。unlhavc.libじゃなくてUNLHA32.LIBを使ってください。
たぶん、サイトの情報が古いんだと思います。
プログラム見ましたが、fopen()する事はできません。
lzhなどアーカイブ・ファイルの中身に対して、fopenする事は出来ませんので。
fopen()とfread()の代わりがUnlhaExtractMem()です。
ファイルのオリジナルサイズもINDIVIDUALINFO から得てください。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月28日(金) 20:16
by たろう
返信ありがとうございます。
テキストファイルの文字列の出力方法はどうなるのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月28日(金) 21:07
by softya
>テキストファイルの文字列の出力方法はどうなるのでしょうか?
アーカイブでもfopen()時と特に変わりません。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月28日(金) 21:26
by たろう
回答ありがとうございます。
freadでやれと言うことでしょうか?
でも、fpは使えないのでどうすればよいのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月28日(金) 22:30
by softya
>回答ありがとうございます。
>freadでやれと言うことでしょうか?
>でも、fpは使えないのでどうすればよいのでしょうか?
UnlhaExtractMem()でメモリ展開されるので読み込みは必要ありません。
これがfopen()とfread()の代用だと書いたのは、UnlhaExtractMem()が2つの機能を併せ持つからです。
一度メモリに読み込まれてしまえば、fread()したテキストもUnlhaExtractMem()したテキストも同じものです。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月28日(金) 23:10
by たろう
このように変更してみたんですが、
typedef struct _tagfiledata{
char FileName[MAX_PATH];
BYTE* str;
unsigned long long int size;
struct _tagfiledata* memoryAddress;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
DWORD size;
FILEDATA* prev;
BYTE* buffer;
unsigned long* i=0;
//データのサイズを取得する
size=data.dwOriginalSize ;
//メモリーを確保
prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
prev->str=(BYTE*)malloc((size_t)(size));
//ファイルを開く
UnlhaExtractMem(hWnd,data.szFileName,prev->str,size,NULL,NULL,NULL);<==ここ
//構造体にデータを入れる
strcpy(prev->FileName,data.szFileName);
prev->size=size;
prev->memoryAddress=prev;
prev->nextnode=(*nextdata);
(*nextdata)=prev;
}
としたのですが、ここのところ(prev->str)にテキストファイルの文字列が出力されると思ったのですが、
違うのでしょうか?
違う場合何か抜けていたりするのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月28日(金) 23:41
by softya
UnlhaExtractMem前に
strcpy(full_file_str,"test.lzh c:");
strcat(full_file_str,ii.szFileName);
の部分が抜けてますよ。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 00:13
by たろう
追加してみましたがダメでした。
何が間違っているのでしょうか?
ソース載せます。
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
#define MAX_PATH 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
BYTE* str;
unsigned long long int size;
struct _tagfiledata* memoryAddress;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata);
int main(void)
{
HWND hWnd=0;
FILE *fp;
char full_file_str[512];
unsigned char buffer;
int i=0;
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
HARC hArc;
INDIVIDUALINFO ii;
hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON);
if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
do {
Filedatasyutoku(ii,hWnd,&filedata);
} while (UnlhaFindNext(hArc, &ii) != -1);
}
UnlhaCloseArchive(hArc);
nextdata=filedata;
while(nextdata!=NULL ){
printf("%s",nextdata->FileName);
printf("\n");
printf("%p",nextdata->memoryAddress);
printf("\n");
for(int i=0;i<nextdata->size;i++)
{
if((const char)nextdata->str=='\n')
nextdata->size--;
printf("%c",(const char)nextdata->str);
}
printf("\n");
nextdata=nextdata->nextnode;
}
while(filedata!=NULL)
{
nextdata=filedata->nextnode;
free(filedata->str);
free(filedata);
filedata=nextdata;
}
return 0;
}
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
DWORD size;
FILEDATA* prev;
BYTE* buffer;
char full_file_str[512];
unsigned long* i=0;
//データのサイズを取得する
size=data.dwOriginalSize ;
//メモリーを確保
prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
prev->str=(BYTE*)malloc((size_t)(size));
strcpy(full_file_str,"test.lzh c:");
strcat(full_file_str,data.szFileName);
//ファイルを開く
UnlhaExtractMem(hWnd,full_file_str,prev->str,size,NULL,NULL,NULL);
//構造体にデータを入れる
strcpy(prev->FileName,data.szFileName);
prev->size=size;
prev->memoryAddress=prev;
prev->nextnode=(*nextdata);
(*nextdata)=prev;
}
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 09:48
by たろう
変更したので載せます。
参考のサイト通りでやったつもりなのですが、どこが間違っているのでしょうか?
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
#define MAX_PATH 260
#define MAX_TEXT 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
BYTE* str;
unsigned long long int size;
struct _tagfiledata* memoryAddress;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata);
int main(void)
{
HWND hWnd=0;
FILE *fp;
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
HARC hArc;
INDIVIDUALINFO ii;
hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON);
if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
do {
Filedatasyutoku(ii,hWnd,&filedata);
} while (UnlhaFindNext(hArc, &ii) != -1);
}
UnlhaCloseArchive(hArc);
nextdata=filedata;
while(nextdata!=NULL ){
UnlhaExtractMem(hWnd,nextdata->FileName,nextdata->str,nextdata->size,NULL,NULL,NULL);
nextdata=nextdata->nextnode;
}
nextdata=filedata;
while(nextdata!=NULL ){
printf("%s",nextdata->FileName);
printf("\n");
printf("%p",nextdata->memoryAddress);
printf("\n");
printf("%d",nextdata->size);
printf("\n");
for(int i=0;i<nextdata->size;i++)
{
if(nextdata->str=='\n')
{
nextdata->size--;
}
printf("%c",(const char*)nextdata->str);
}
printf("\n");
nextdata=nextdata->nextnode;
}
while(filedata!=NULL)
{
nextdata=filedata->nextnode;
free(filedata->str);
free(filedata);
filedata=nextdata;
}
return 0;
}
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
DWORD size;
FILEDATA* prev;
BYTE* buffer;
char full_file_str[512];
unsigned long* i=0;
//データのサイズを取得する
size=data.dwOriginalSize ;
//メモリーを確保
prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
prev->str=(BYTE*)malloc((size_t)(size));
strcpy(full_file_str,"test.lzh c:");
strcat(full_file_str,data.szFileName);
//ファイルを開く
//構造体にデータを入れる
strcpy(prev->FileName,data.szFileName);
prev->size=size;
prev->memoryAddress=prev;
prev->nextnode=(*nextdata);
(*nextdata)=prev;
}
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 12:04
by softya
確認してみました。
なんども書いてますが、UnlhaExtractMemのパラメータが
strcpy(full_file_str,"test.lzh c:");
strcat(full_file_str,ii.szFileName);
で作ったコマンドじゃないとダメですよ。
デバッガでちゃんと引数とか確認してますか?
基本的なことなんですが、基本を疎かにしてはプログラム力は伸びませんし、このやりとりが時間のロスです。
あと、ファイル名に空白を含くむ場合はダブルクオートでコマンドのファイル名を囲む必要があります。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 12:40
by たろう
Title: Re:アーカイブファイルを解凍してメモリーに保持することは可能?
変更したので載せます。
参考のサイト通りでやったつもりなのですが、どこが間違っているのでしょうか?
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
#define MAX_PATH 260
#define MAX_TEXT 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
BYTE* str;
unsigned long long int size;
struct _tagfiledata* memoryAddress;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata);
int main(void)
{
HWND hWnd=0;
FILE *fp;
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
HARC hArc;
INDIVIDUALINFO ii;
hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON);
if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
do {
Filedatasyutoku(ii,hWnd,&filedata);
} while (UnlhaFindNext(hArc, &ii) != -1);
}
UnlhaCloseArchive(hArc);
nextdata=filedata;
while(nextdata!=NULL ){
strcpy(full_file_str,"test.lzh c:");
strcat(full_file_str,ii.szFileName);
UnlhaExtractMem(hWnd,full_file_str,nextdata->str,nextdata->size,NULL,NULL,NULL);
nextdata=nextdata->nextnode;
}
nextdata=filedata;
while(nextdata!=NULL ){
printf("%s",nextdata->FileName);
printf("\n");
printf("%p",nextdata->memoryAddress);
printf("\n");
printf("%d",nextdata->size);
printf("\n");
for(int i=0;i<nextdata->size;i++)
{
if(nextdata->str=='\n')
{
nextdata->size--;
}
printf("%c",(const char*)nextdata->str);
}
printf("\n");
nextdata=nextdata->nextnode;
}
while(filedata!=NULL)
{
nextdata=filedata->nextnode;
free(filedata->str);
free(filedata);
filedata=nextdata;
}
return 0;
}
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
DWORD size;
FILEDATA* prev;
BYTE* buffer;
char full_file_str[512];
unsigned long* i=0;
//データのサイズを取得する
size=data.dwOriginalSize ;
//メモリーを確保
prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
prev->str=(BYTE*)malloc((size_t)(size));
//ファイルを開く
//構造体にデータを入れる
strcpy(prev->FileName,data.szFileName);
prev->size=size;
prev->memoryAddress=prev;
prev->nextnode=(*nextdata);
(*nextdata)=prev;
}
すみません。やっていませんでした。
直してみたのですが、できません。なぜでしょうか?
>あと、ファイル名に空白を含くむ場合はダブルクオートでコマンドのファイル名を囲む必要があります。
テキストファイル名をさらにダブルクオートでかこむということでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 12:43
by たろう
変更しました。
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
#define MAX_PATH 260
#define MAX_TEXT 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
BYTE* str;
unsigned long long int size;
struct _tagfiledata* memoryAddress;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata);
int main(void)
{
HWND hWnd=0;
FILE *fp;
char full_file_str;
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
HARC hArc;
INDIVIDUALINFO ii;
hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON);
if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
do {
Filedatasyutoku(ii,hWnd,&filedata);
} while (UnlhaFindNext(hArc, &ii) != -1);
}
UnlhaCloseArchive(hArc);
nextdata=filedata;
while(nextdata!=NULL ){
strcpy(full_file_str,"test.lzh c:");
strcat(full_file_str,ii.szFileName);
UnlhaExtractMem(hWnd,full_file_str,nextdata->str,nextdata->size,NULL,NULL,NULL);
nextdata=nextdata->nextnode;
}
nextdata=filedata;
while(nextdata!=NULL ){
printf("%s",nextdata->FileName);
printf("\n");
printf("%p",nextdata->memoryAddress);
printf("\n");
printf("%d",nextdata->size);
printf("\n");
for(int i=0;i<nextdata->size;i++)
{
if(nextdata->str=='\n')
{
nextdata->size--;
}
printf("%c",(const char*)nextdata->str);
}
printf("\n");
nextdata=nextdata->nextnode;
}
while(filedata!=NULL)
{
nextdata=filedata->nextnode;
free(filedata->str);
free(filedata);
filedata=nextdata;
}
return 0;
}
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
DWORD size;
FILEDATA* prev;
BYTE* buffer;
char full_file_str[512];
unsigned long* i=0;
//データのサイズを取得する
size=data.dwOriginalSize ;
//メモリーを確保
prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
prev->str=(BYTE*)malloc((size_t)(size));
//ファイルを開く
//構造体にデータを入れる
strcpy(prev->FileName,data.szFileName);
prev->size=size;
prev->memoryAddress=prev;
prev->nextnode=(*nextdata);
(*nextdata)=prev;
}
すみません。やっていませんでした。
直してみたのですが、できません。なぜでしょうか?
>あと、ファイル名に空白を含くむ場合はダブルクオートでコマンドのファイル名を囲む必要があります。
テキストファイル名をさらにダブルクオートでかこむということでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 12:50
by たろう
変更しました。
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
#define MAX_PATH 260
#define MAX_TEXT 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
BYTE* str;
unsigned long long int size;
struct _tagfiledata* memoryAddress;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata);
int main(void)
{
HWND hWnd=0;
FILE *fp;
char full_file_str[512];
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
HARC hArc;
INDIVIDUALINFO ii;
hArc = UnlhaOpenArchive(hWnd, "test.lzh", M_ERROR_MESSAGE_ON);
if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
do {
Filedatasyutoku(ii,hWnd,&filedata);
} while (UnlhaFindNext(hArc, &ii) != -1);
}
UnlhaCloseArchive(hArc);
nextdata=filedata;
while(nextdata!=NULL ){
strcpy(full_file_str,"test.lzh c:""");
strcat(full_file_str,ii.szFileName);
strcat(full_file_str,"""");
UnlhaExtractMem(hWnd,nextdata->FileName,nextdata->str,nextdata->size,NULL,NULL,NULL);
nextdata=nextdata->nextnode;
}
nextdata=filedata;
while(nextdata!=NULL ){
printf("%s",nextdata->FileName);
printf("\n");
printf("%p",nextdata->memoryAddress);
printf("\n");
printf("%d",nextdata->size);
printf("\n");
for(int i=0;i<nextdata->size;i++)
{
if(nextdata->str=='\n')
{
nextdata->size--;
}
printf("%c",(const char*)nextdata->str);
}
printf("\n");
nextdata=nextdata->nextnode;
}
while(filedata!=NULL)
{
nextdata=filedata->nextnode;
free(filedata->str);
free(filedata);
filedata=nextdata;
}
return 0;
}
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
DWORD size;
FILEDATA* prev;
BYTE* buffer;
char full_file_str[512];
unsigned long* i=0;
//データのサイズを取得する
size=data.dwOriginalSize ;
//メモリーを確保
prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
prev->str=(BYTE*)malloc((size_t)(size));
//ファイルを開く
//構造体にデータを入れる
strcpy(prev->FileName,data.szFileName);
prev->size=size;
prev->memoryAddress=prev;
prev->nextnode=(*nextdata);
(*nextdata)=prev;
}
すみません。やっていませんでした。
直してみたのですが、できません。なぜでしょうか?
>あと、ファイル名に空白を含くむ場合はダブルクオートでコマンドのファイル名を囲む必要があります。
テキストファイル名をさらにダブルクオートでかこむということでしょうか?
ダブルクオ-トしないでやってみましたが、それでも文字列(UnlhaExtractMem(hWnd,nextdata->FileName,nextdata->str,nextdata->size,NULL,NULL,NULL);
のnextdata->str)は出力されませんでした。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 13:29
by softya
どうみても、最後のコードはfull_file_strをUnlhaExtractMemのパラメータとして使ってませんよ。
なんども書きますが、デバッガで必ず確認してください。
それとコマンドの書式が微妙に違っています。
ヒント:空白
本当に参考サイトと同じ書き方ですか?よく確かめてみてください。
"""" ← これもちゃんと目的の動作してます?
全面的に確認不足がトラブルの原因です。よく確かめましょう。
1.作られた中間データ、文字列はデバッガで必ず確認。
2.引数に問題がないか、これもデバッガで確認。
3.どうしても動かなかったら、手書きで動作を確認。
UnlhaExtractMem(hWnd,"test.lzh c: test.txt",nextdata->str,nextdata->size,NULL,NULL,NULL);

Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 18:31
by たろう
すみません。
UnlhaExtractMem(hWnd,full_file_str,nextdata->str,nextdata->size,NULL,NULL,NULL);
でした。
できたというか日本語のファイル名は処理してくれないのでしょうか?
それとも何か見落としているところがあるのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 18:42
by softya
私のところでは問題なく動きます。
いろいろな名前でテストして見ましたか?
あるいは見落としはないですか?
ダメなら、そのダメなファイル名を教えてください。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 18:56
by たろう
新規テキスト ドキュメント.txtと、新規テキスト ドキュメント(2).txt
日本語 日本語.txtです。
ファイル名を「日本語.txt」と「日本語 日本語」にしたら表示されました。
多分半角空白文字を入れるとダメみたいです。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 19:23
by softya
いえ、私のところでは問題はありません。
>新規テキスト ドキュメント.txt と、新規テキスト ドキュメント(2).txt
>日本語 日本語.txtです。
別の問題の可能性があります。
プロジェクトの構成プロパティの全般で文字セットは、マルチバイト文字になってますか?UNICODEだとまずいですよ。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 19:35
by たろう
文字セットはマルチバイト文字になっています。
気にしなくても大丈夫でしょうか?
一応ソース載せてみます。
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "unlha32.h"
#define MAX_PATH 260
#define MAX_TEXT 260
typedef struct _tagfiledata{
char FileName[MAX_PATH];
BYTE* str;
unsigned long long int size;
struct _tagfiledata* memoryAddress;
struct _tagfiledata* nextnode;
}FILEDATA;
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata);
int main(void)
{
HWND hWnd=0;
FILE *fp;
char full_file_str[512];
WIN32_FIND_DATA FindFileData;
HANDLE hFind,hFind2;
FILEDATA *filedata=NULL,*nextdata=NULL;
HARC hArc;
INDIVIDUALINFO ii;
hArc = UnlhaOpenArchive(hWnd, "test.dat", M_ERROR_MESSAGE_ON);
if (UnlhaFindFirst(hArc, "*.*", &ii) != -1) {
do {
Filedatasyutoku(ii,hWnd,&filedata);
} while (UnlhaFindNext(hArc, &ii) != -1);
}
UnlhaCloseArchive(hArc);
nextdata=filedata;
while(nextdata!=NULL ){
strcpy(full_file_str,"test.dat c: ");
strcat(full_file_str,nextdata->FileName);
UnlhaExtractMem(hWnd,full_file_str,nextdata->str,nextdata->size,NULL,NULL,NULL);
nextdata=nextdata->nextnode;
}
nextdata=filedata;
while(nextdata!=NULL ){
printf("%s",nextdata->FileName);
printf("\n");
printf("%p",nextdata->memoryAddress);
printf("\n");
printf("%d",nextdata->size);
printf("\n");
for(int i=0;i<nextdata->size;i++)
{
printf("%c",(const char*)nextdata->str);
}
printf("\n");
nextdata=nextdata->nextnode;
}
while(filedata!=NULL)
{
nextdata=filedata->nextnode;
free(filedata->str);
free(filedata);
filedata=nextdata;
}
return 0;
}
void Filedatasyutoku(INDIVIDUALINFO data,HWND hWnd,FILEDATA** nextdata)
{
DWORD size;
FILEDATA* prev;
BYTE* buffer;
char full_file_str[512];
unsigned long* i=0;
//データのサイズを取得する
size=data.dwOriginalSize ;
//メモリーを確保
prev=(FILEDATA*)malloc((size_t)sizeof(FILEDATA));
prev->str=(BYTE*)malloc((size_t)(size));
//ファイルを開く
//構造体にデータを入れる
strcpy(prev->FileName,data.szFileName);
prev->size=size;
prev->memoryAddress=prev;
prev->nextnode=(*nextdata);
(*nextdata)=prev;
}
それと次は何をすればいいのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 19:44
by softya
基本は出来たのでDXライブラリで画像とテキストを表示するとか、自分で使いたいアーカイブ形式にチェンジするとか自由にしてもらってかまいませんよ。何やりたいですか?
コードは後で確認しておきます。ダブルクオートで囲んでいないのが問題かも。
ちなみに、"\""と書くのが正解です。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 20:01
by たろう
うまくいきました。
ありがとうございます!
>基本は出来たのでDXライブラリで画像とテキストを表示するとか、自分で使いたいアーカイブ形式にチェン>ジするとか自由にしてもらってかまいませんよ。何やりたいですか?
このサイトのアーカイブファイルの解凍ソフトを作りたいです!
http://asobinosusume.com/program/prg_arc.php
ハードル高いでしょうか?
どうすればよいのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 21:00
by softya
大して長いプログラムでも無いので、まずアーカイブ・プログラムの理解とファイル構造の解析を行って見てください。そもそも圧縮かかってないですし。
出力されたファイルをバイナリエディタで覗いていて見るのも良いでしょう。
http://www.vector.co.jp/soft/win95/util/se079072.html
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 21:50
by たろう
出力されたファイルをバイナリエディタで見ましたが、これをどうやって元の形に戻すことができるんでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 22:26
by softya
ファイル構造を理解しないとアーカイブの展開処理を作るのは困難なので、アーカイブ作成プログラムの理解を進めましょう。書き出しの逆を作れば読み出し・展開プログラムになります。
そもそもプログラムは、ちゃんと読まれました?FindNextFileとか、その他のものもご存知の文法や関数しか出てこないと思うんですが違いますか?
ここでもデバッガを駆使して、どの様にfwriteされていくか追いかけてみてください。そしてファイルの、どの部分がアーカイブ構造体のどの部分に該当するか調べてみてください。
まず先頭16バイトは、どんな16進数になってます?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 22:35
by たろう
返信ありがとうございます。
07 00 00 00 04 09 00 00 3E 00 00 00 6C 69 73 74 ........>...list
です。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月29日(土) 22:51
by softya
じゃあ、この値の意味をプログラムから解読してみてください。
07 00 00 00 04 09 00 00 3E 00 00 00 6C 69 73 74 ........>...list
先頭から2バイトは、構造体のここですとか。
struct DATA{
short num; =>07 00
};
とか書き出してみてください。
※今は嘘書いてますので、ちゃんとプログラをみて書いてくださいね。、
ちなみにインテルx86系CPUは、数値のメモリ内保存形態がリトルエンディアンなので出力したファイルをバイナリエディタで見ると値の並びが逆になります。
例えば
int no = 0x01020304;
と言うデータをファイルに書いてバイナリエディタで16進で見ると
04 03 02 01
となります。これがリトルエンディアンです。
http://ja.wikipedia.org/wiki/%E3%82%A8% ... 2%E3%83%B3
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月30日(日) 00:24
by たろう
>じゃあ、この値の意味をプログラムから解読してみてください。
>07 00 00 00 04 09 00 00 3E 00 00 00 6C 69 73 74 ........>...list
>先頭から2バイトは、構造体のここですとか。
>struct DATA{
> short num; =>07 00
>};
>とか書き出してみてください。
>※今は嘘書いてますので、ちゃんとプログラムをみて書いてくださいね。、
書いてみたんですけど、こんなのでいいのでしょうか?
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_PATH 260
typedef struct {
unsigned short title;
unsigned short memo;
}DATA;
int main(void)
{
FILE *file_fp,*copy_fp;
HANDLE hFind;
WIN32_FIND_DATA FindFileData;
DATA filedata;
hFind = FindFirstFile( "*.dat", &FindFileData );
do{
if(fopen_s(&file_fp,FindFileData.cFileName,"rb")==NULL)
return -1;
}while(FindNextFile(hFind,&FindFileData));
return 0;
}
すみません。全然わかりません。
どのようにしたらよいのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月30日(日) 00:34
by softya
違いますよ。
アーカイブソフトの解読ですので、
http://asobinosusume.com/program/prg_arc.php
の自作アーカイバのソースコードをみて解析してください。
構造体もarc.zipの中にあるソースコード中に含まれています。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月30日(日) 12:33
by たろう
理解したつもりなのですが、これをどうやって解析すればいいのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月30日(日) 21:18
by softya
>理解したつもりなのですが、これをどうやって解析すればいいのでしょうか?
とりあえず何をfwriteしているか確かめてみてはどうしょうか?
デバッガで確認できます。
私も一日中パソコンの前にいるわけではないので、自分でできることをやってみてください。
今週は、火曜日と金曜日は不在の予定です。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月30日(日) 22:19
by たろう
できました。ありがとうございます。
一つ聞きたいのですが、関係あるんですけどD3DXCreateTextureFromFileInMemory()関数の第二引数のメモリ内のファイルへのポインタとは、画像ファイルをmalloc()関数で画像分のデータを確保したデータにfread()関数で書き込んだデータを入れてそのmalloc()関数した先頭のポインタを入れればいいのでしょうか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月30日(日) 22:48
by softya
>できました。ありがとうございます。
アーカイブの展開が出来たと言うことでしょうか?
>一つ聞きたいのですが、関係あるんですけどD3DXCreateTextureFromFileInMemory()関数の第二引数のメモリ内のファイルへのポインタとは、画像ファイルを malloc()関数で画像分のデータを確保したデータにfread()関数で書き込んだデータを入れてそのmalloc()関数した先頭のポインタを入れればいいのでしょうか?
そのはずです。なにか問題がありましたか?
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月31日(月) 01:52
by たろう
はい。単純に考えてみたらできました。
いろいろ助言ありがとうございました!
>そのはずです。なにか問題がありましたか?
いいえ。合っているのならいいです。
ありがとうございます!
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月31日(月) 02:09
by たろう
すみません。このエラーはどうしたら消えるのでしょうか?
main.obj : error LNK2019: 未解決の外部シンボル _D3DXCreateSprite@8 が関数 _WinMain@16 で参照されました。
main.obj : error LNK2019: 未解決の外部シンボル _D3DXCreateTextureFromFileA@12 が関数 _WinMain@16 で参照されました。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年5月31日(月) 02:44
by たろう
すみません。解決したので別の質問をします。
このプログラムで画像ファイルを出力しようとしたのですが、
表示されません。なぜでしょうか?
#include<windows.h>
#include<stdio.h>
#include <d3dx9.h>
#pragma comment( lib, "d3dx9.lib")
#pragma comment( lib, "d3d9.lib" )
LPD3DXSPRITE g_pD3DXSprite = NULL;
LPDIRECT3DTEXTURE9 g_pD3DTexture = NULL;
char g_SpriteFileName[MAX_PATH] = "test.png";
WIN32_FIND_DATA FindFileData;
BYTE* data;
HRESULT hr;
LPDIRECT3D9 m_pD3D;
IDirect3DDevice9* g_pD3DDevice=NULL;
LPDIRECT3D9 g_pD3D = NULL; // Direct3Dインターフェイス
FILE *fp;
D3DDISPLAYMODE dmode;
D3DPRESENT_PARAMETERS g_D3DPP; // D3DDeviceの設定(現在)
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, UINT wParam, LONG lParam)
{
HRESULT hr = S_OK;
switch(msg)
{
case WM_DESTROY:
// ウインドウを閉じる
PostQuitMessage(0);
return 0;
}
// デフォルト処理
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hprevInst,LPSTR lpCmdLine,int nShowCmd)
{
WNDCLASSEX wc;
HWND hWnd;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style =0;
wc.cbClsExtra=0;
wc.cbWndExtra=32;
wc.lpfnWndProc=MainWndProc;
wc.hInstance =hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hIconSm =LoadIcon(NULL,IDI_WINLOGO);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName="gamemain";
if (!RegisterClassEx(&wc))
return -1;
hWnd = CreateWindow("gamemain", "ant",
WS_OVERLAPPEDWINDOW,
0, 0, 640, 480,
NULL, NULL, hInstance, NULL);
if(hWnd==NULL)
{
return -1;
}
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
D3DCAPS9 Caps; // 能力を受け取るD3DCAPS9構造体
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (g_pD3D == NULL)
return -1 ;
hr = g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &Caps);
if (FAILED(hr))
{
hr = g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, &Caps);
if (FAILED(hr) )
return -1;
}
// 現在のディスプレイのフォーマットなどを取得しておく
hr = g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dmode);
if (FAILED(hr))
return -1;
ZeroMemory(&g_D3DPP, sizeof(g_D3DPP));
g_D3DPP.BackBufferCount = 1;
g_D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
g_D3DPP.hDeviceWindow = hWnd;
g_D3DPP.Windowed = TRUE;
g_D3DPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_D3DPP, &g_pD3DDevice);
if (FAILED(hr))
{
hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &g_D3DPP, &g_pD3DDevice);
if (FAILED(hr))
return -1;
}
//ファイルを開く
if((fp=fopen("test.png","r+b"))==NULL)
{
return -1;
}
//ファイルのデータを読み込む
FindFirstFile("*.png",&FindFileData);
data=(BYTE*)malloc((size_t)(FindFileData.nFileSizeLow));
fread(data,FindFileData.nFileSizeLow,1,fp);
//メモリに読み込む
if( FAILED(D3DXCreateTextureFromFileInMemory(g_pD3DDevice,data,FindFileData.nFileSizeLow,&g_pD3DTexture)))
return -1;
// スプライト生成
if( FAILED(D3DXCreateSprite(g_pD3DDevice, &g_pD3DXSprite)))
{
return -1;
}
MSG msg;
do
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
g_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB( 0, 0, 0, 255 ), 1.0f, 0 );
if( SUCCEEDED( g_pD3DDevice->BeginScene() ) )
{
g_pD3DXSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE);
RECT r={0,0,128,32};
D3DXVECTOR3 C(100,100,0);
D3DXVECTOR3 P(100,100,0);
g_pD3DXSprite->Draw(g_pD3DTexture,NULL,NULL,NULL,0xffffffff);
g_pD3DXSprite->End();
g_pD3DDevice->EndScene();
}
}
} while (msg.message != WM_QUIT);
return 0;
}
です。よろしくお願いします。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年6月01日(火) 11:32
by softya
すいません、今日も無理そうなんで。
ここは解決にして、別質問してもらえますか?
どう、うまく表示されないか書き添えてください。
出来ればプロジェクト全体(debug/Releaseフォルダ内容は不要)をアップロードすると回答してくれる人が楽です。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年6月01日(火) 12:12
by Justy
多分 IDirect3DDevice9::Presentが呼ばれてないんじゃないかと思いますけど。
全くアーカイブに関係ないのであれば、softyaさんの仰るとおり別スレした方がいいですね。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年6月01日(火) 18:18
by たろう
softyaさんありがとうございます。
解決します。本当にありがとうございました。
Justyさんありがとうございます。
言われたとおりやってみたらうまくいきました。
ありがとうございました。またわからないことがあるので別スレに書こうと思います。
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年6月01日(火) 18:19
by たろう
解決しました!
Re:アーカイブファイルを解凍してメモリーに保持することは可能?
Posted: 2010年6月03日(木) 17:33
by Justy
なにやら投稿がダブっていたので削除しました。
