アーカイブファイルを解凍してメモリーに保持することは可能?

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

アーカイブファイルを解凍してメモリーに保持することは可能?

#1

投稿記事 by たろう » 15年前

プログラムであるアーカイブファイルを解凍してメモリーに保持することは可能でしょうか?
また出きるのなら、どういう風にプログラムすればよいのでしょうか?アーカイブファイルを解凍してメモリーに保持
する関数はあるのでしょうか?
それとどうやったらそのメモリに保持した画像データやテキストデータを使うことが出来るのでしょうか?(関数があ
るのでしょうか?)
環境はVC++2005
よろしくお願いします。

ベリ工

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#2

投稿記事 by ベリ工 » 15年前

昔私も同じ事を考え、いろいろ思考錯誤した結果、
zlib(詳細はネットで検索して下さい)という圧縮解凍する
ライブラリをファイルIOが発生しないメモリ上のみで
圧縮解凍できるように自分で改造しました。そのようなメモリ上で
圧縮解凍する関数等は見つかりませんでしたので・・・もしかしたら
見落としていただけかもしれませんが、改造にそこそこ苦労した
記憶があります。

なので、少なくともzlibというライブラリを自分でメモリ上で
圧縮解凍できるように改造すればできます。

参考までに。

ベリ工

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#3

投稿記事 by ベリ工 » 15年前

あ、ちょっと違いました。私が改造したのは
メモリ上のバイナリデータをファイルIO無しに
メモリ上で圧縮解凍する関数を自作したと言う意味です。
なのでたろうさんの意図する"ファイルから"では無いですが、
メモリ上のバイナリデータをメモリ上で圧縮解凍できるので
問題なくできるでしょう。

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#4

投稿記事 by softya » 15年前

解凍ライブラリを自分で作るか、既存のライブラリをうまく使って処理する必要があります。C言語の標準ライブラリにはありません。また、ZIP解凍はWin32APIとして公開されていない様です。

こちらが開発関係の有名サイトです。
http://www.csdinc.co.jp/archiver/
ライブラリを使う場合は、各ライブラリのライセンスをよく読んでください。

>それとどうやったらそのメモリに保持した画像データやテキストデータを使うことが出来るのでしょうか?(関数があるのでしょうか?)

それぞれのAPIやライブラリ別に方法が必要でモノによっては非常に面倒ですが、Win32API/MFC/.NET FrameWork/DirectX/DXライブラリで手法が違います。
解凍以前に、メモリにロードした画像やテキストを扱う方法を勉強されることをお勧めします。 画像

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#5

投稿記事 by たろう » 15年前

ベリエさん回答ありがとうございます。
できることはできるんですね。
ありがとうございます。
softyaさん回答ありがとうございます。
>解凍以前に、メモリにロードした画像やテキストを扱う方法を勉強されることをお勧めします。
とは何を勉強すればよいのでしょうか?
勉強不足ですみません。

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#6

投稿記事 by softya » 15年前

>>解凍以前に、メモリにロードした画像やテキストを扱う方法を勉強されることをお勧めします。
>とは何を勉強すればよいのでしょうか?

画像イメージファイルのバイナリ・ファイル入力でのメモリへ読み込みやテキストのファイル入出力などをC言語で行うことです。

例えば、画像イメージファイルをDXライブラリで扱う場合だと
画像イメージファイルをまずmalloc等で割り当てたメモリに読み込んでから、CreateGraphFromMem()でグラフィックハンドルを得て表示出来る事を確認して見てください。
http://homepage2.nifty.com/natupaji/DxL ... tml#R15N26

テキストならプログラムでテキストファイルを作成したり、テキストファイルを読み込んで内容のテキストを画面に表示したりしてみてください。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#7

投稿記事 by たろう » 15年前

回答ありがとうございます。
>テキストならプログラムでテキストファイルを作成したり、テキストファイルを読み込んで内容のテキストを>画面に表示したりしてみてください。
とは、fopen関数を使ってやると言うことでしょうか?
だとしたら、アーカイブファイルを解凍してメモリ上にテキストで読み込むときどうすればよいのでしょうか?
なにか勘違いしていたらすみません。

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#8

投稿記事 by softya » 15年前

>とは、fopen関数を使ってやると言うことでしょうか?

そう言う事です。

>だとしたら、アーカイブファイルを解凍してメモリ上にテキストで読み込むときどうすればよいのでしょうか?
>なにか勘違いしていたらすみません。

アーカイブ以前に普通のファイルでこれが出来ないとアーカイブを扱うことは困難です。
一歩一歩理解してください。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#9

投稿記事 by たろう » 15年前

回答ありがとうございます。fopen()は普通にファイルの書き込みや読み込みはできてるつもりではいるのですが。引数1にファイル名を指定して引数2にファイルオープンモードを指定する。と言うのはわかるのですが、これでは駄目という事でしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#10

投稿記事 by softya » 15年前

>回答ありがとうございます。fopen()は普通にファイルの書き込みや読み込みはできてるつもりではいるのですが。引数1にファイル名を指定して引数2にファイルオープンモードを指定する。と言うのはわかるのですが、これでは駄目という事でしょうか?

それで構いません。
テキストファイルを読み込んで表示するプログラムが作れますか?
ただしテキストサイズは不定です。
これがレベル1です。

次のレベル2は、
不定サイズのテキストファイルを復数読み込むプログラムを作ることは出来ますか?
全てのファイル名とファイル・サイズは、何らから方法で与えられるとします。
ファイルの読み込むメモリは、mallocを使って確保してください。
ファイル数も不定なので、メモリに読み込まれたファイルを管理するリスト構造なども必要です。
数が決め打ちの配列を使うことは出来ません。
この前提でプログラムが作れるならレベル2をクリアです。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#11

投稿記事 by たろう » 15年前

レベル1はできるのですが、

>全てのファイル名とファイル・サイズは、何らから方法で与えられるとします。
ファイル名はどうやって調べればよいのでしょうか?
>ファイル数も不定なので、メモリに読み込まれたファイルを管理するリスト構造なども必要です。
リスト構造は何を入れればいいのでしょうか?
初歩的な質問ですみません。

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#12

投稿記事 by softya » 15年前

>>全てのファイル名とファイル・サイズは、何らから方法で与えられるとします。
>ファイル名はどうやって調べればよいのでしょうか?

テキストで与えられても良いですし、Win32APIのFindFirstFile(),FindNextFile()でディレクトリ中からテキストだけ抽出しても良いです。
http://msdn.microsoft.com/ja-jp/library/cc429233.aspx

>>ファイル数も不定なので、メモリに読み込まれたファイルを管理するリスト構造なども必要です。
>リスト構造は何を入れればいいのでしょうか?

ファイル名
サイズ
読み込みメモリのアドレス
は最低限必要です。
後は、リスト構造の管理に必要な情報ですね。アルゴリズムの基本通りです。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#13

投稿記事 by たろう » 15年前

回答ありがとうございます。
読み込みメモリのアドレスはどうやって調べればよいのでしょうか?
以下はできたプログラムです。
#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; 
}

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#14

投稿記事 by softya » 15年前

拝見しました。色々と問題あります。

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:アーカイブファイルを解凍してメモリーに保持することは可能?

#15

投稿記事 by たろう » 15年前

回答ありがとうございます。
>(a)全テキストファイルをメモリに取り込む
とはどのようにしたらいいのでしょうか?
各テキストファイルの文字列数の合計がわからないのにどうやって保持すればよいのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#16

投稿記事 by softya » 15年前

>各テキストファイルの文字列数の合計がわからないのにどうやって保持すればよいのでしょうか?
ファイルサイズは分かっているので、そのまま読み込めば良いだけですよ。
文字列として扱う必要があるのはテキスト表示する時だけですので、その時に\nを文字列の終端として扱ってやればい良いことになります。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#17

投稿記事 by たろう » 15年前

返信ありがとうございます。
わからなくなったので質問します。
このソースで実行したら、ここの部分で処理が止まってしまいました。
どうしてでしょうか?
#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; 
}

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#18

投稿記事 by softya » 15年前

えーと、読みづらいのでコメントを入れてくださいね。
理由は、nextdataに不正な値が入っているためです。
根本的な問題はリスト構造の作り方が間違っているためで、realloc()は出来くるはずが無いのですが見直してみてください。
それとFindFirstFile()とFindNextFile()のあとファイル処理は共通化出来るので関数に分離してみてください。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#19

投稿記事 by たろう » 15年前

#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);

}
とやったのですが、
データが取得されないですが、
これはポインタが理解していないのでしょうか。
どこを直せばいいのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#20

投稿記事 by softya » 15年前

このプログラムってデバッガでトレースしてみましたか?
デバッガを使いないとちょっとした問題でも何時間でも悩むことになるので、デバッガを使うようにしてください。

問題点は幾つかあります。

・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:アーカイブファイルを解凍してメモリーに保持することは可能?

#21

投稿記事 by たろう » 15年前

参考のサイトありがとうございます。
しかしそれは理解しているつもりの内容なのですが、
ダブルポインタでやるのはわかったのですがそれで試行錯誤してやっていったのですが、
できないというか、わかりません。何がいけないのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#22

投稿記事 by softya » 15年前

>ダブルポインタでやるのはわかったのですがそれで試行錯誤してやっていったのですが、

もし呼び出した関数の方でポインタの値を書き換えたいなら、ポインタのポインタを関数に渡す必要がありあます。現状のソースコードは、単純なポインタしか渡していませんよね。
ところで、ちゃんとデバッガでポインタの値などを確認してトレースしてますか?


ダブルポインタの基本的な書き方
int main()
{
FILEDATA *pdata;
func(&pdata);
}

void func(FILEDATA **ppdata) {
*ppdata = malloc( sizeof(FILEDATA) );
}

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#23

投稿記事 by たろう » 15年前

確認しました。
やっぱり、リストが結合されていませんでした。
アドレスが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);

}

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#24

投稿記事 by softya » 15年前

根本的な問題は、メモリ割り当て時に後方に対してリスト結合を行おうとしてますが、後方のリストは存在しないので結合出来るはずがありません、後方のリストは基本的に無効なのでNULLを代入すべきです。
じゃあ、どうするかと言うとメモリ割り当て時に前方のリストに結合します。1つ手前のリストのポインタと今のリストのポインタをどう管理するか考えてみてください。

※ヒント
1.Filedatasyutoku()の引数は変更する必要はありません。
2.main側でも、Filedatasyutoku()側でも前方リストへの結合は可能です。自分に分かる方法を選んでください。
3.絵に書いてみるとイメージが掴みやすいです。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#25

投稿記事 by たろう » 15年前

できました!
#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

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#26

投稿記事 by softya » 15年前

あっ、それは言い忘れてました。
メモリに保存されているのはテキストは文字列の終端コードがありませんので、そのまま出力するとマズイことになります。1文字づつテキストファイルのサイズ文だけ出力する必要があります。よく見たらテキストファイルのサイズが構造体から無くなってますね。まず構造体にサイズを追加してください。

それとメモリの解放が出来ていません。辿り方は表示する時と同じです。
ただ、何も考えずに解放すると後方のリストのポインタの処理に問題が出ますので注意してください。

それと、一番大きな問題はリスト処理に間違いがあります。3つ以上のテキストファイルを用意してみると分かりますよ。
ヒント
・後方のリストは基本的に無効なので NULLを代入すべきです。 と言ったはずですが守ってますか?
・全部のリストのポインタを確認しましたか?リスト自体のアドレスとnextnodeの指すアドレスを確認してください。
・双方向リストは作っていないので、prevnodeは不要です。と言うか使っていませんし。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#27

投稿記事 by たろう » 15年前

返信ありがとうございます。
>後方のリストは基本的に無効なので 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]

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#28

投稿記事 by softya » 15年前

>何が間違ってしるのでしょうか?
ごめなさい勘違いしてましたね。後ろから前にリストを作っているんですね。で、最後のがリスト先頭になるって事ですね。いや、全然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:アーカイブファイルを解凍してメモリーに保持することは可能?

#29

投稿記事 by たろう » 15年前

返信ありがとうございます。
実行中エラーがでてどこを直せばよいのかわかりません。
ここの所で、「既に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:アーカイブファイルを解凍してメモリーに保持することは可能?

#30

投稿記事 by たろう » 15年前

あと、このサイトに「UNLHA32.LIB はボーランド C++ 用なので間違えないようにして下さい。」
と載っていたのですが、VC++2005では使えないのでしょうか?

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#31

投稿記事 by たろう » 15年前

変更しました。
#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)のところで出てしまいます。
どのようにしたら開くことができるのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#32

投稿記事 by softya » 15年前

>あと、このサイトに「UNLHA32.LIB はボーランド C++ 用なので間違えないようにして下さい。」
>と載っていたのですが、VC++2005では使えないのでしょうか?

ドキュメントに
UNLHA32.LIB : VC++ でコンパイルするためのインポートライブラリです。
と書いてあるので大丈夫ですよ。unlhavc.libじゃなくてUNLHA32.LIBを使ってください。
たぶん、サイトの情報が古いんだと思います。

プログラム見ましたが、fopen()する事はできません。
lzhなどアーカイブ・ファイルの中身に対して、fopenする事は出来ませんので。
fopen()とfread()の代わりがUnlhaExtractMem()です。
ファイルのオリジナルサイズもINDIVIDUALINFO から得てください。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#33

投稿記事 by たろう » 15年前

返信ありがとうございます。
テキストファイルの文字列の出力方法はどうなるのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#34

投稿記事 by softya » 15年前

>テキストファイルの文字列の出力方法はどうなるのでしょうか?
アーカイブでもfopen()時と特に変わりません。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#35

投稿記事 by たろう » 15年前

回答ありがとうございます。
freadでやれと言うことでしょうか?
でも、fpは使えないのでどうすればよいのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#36

投稿記事 by softya » 15年前

>回答ありがとうございます。
>freadでやれと言うことでしょうか?
>でも、fpは使えないのでどうすればよいのでしょうか?

UnlhaExtractMem()でメモリ展開されるので読み込みは必要ありません。
これがfopen()とfread()の代用だと書いたのは、UnlhaExtractMem()が2つの機能を併せ持つからです。
一度メモリに読み込まれてしまえば、fread()したテキストもUnlhaExtractMem()したテキストも同じものです。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#37

投稿記事 by たろう » 15年前

このように変更してみたんですが、
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)にテキストファイルの文字列が出力されると思ったのですが、
違うのでしょうか?
違う場合何か抜けていたりするのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#38

投稿記事 by softya » 15年前

UnlhaExtractMem前に
strcpy(full_file_str,"test.lzh c:");
strcat(full_file_str,ii.szFileName);
の部分が抜けてますよ。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#39

投稿記事 by たろう » 15年前

追加してみましたがダメでした。
何が間違っているのでしょうか?
ソース載せます。
#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:アーカイブファイルを解凍してメモリーに保持することは可能?

#40

投稿記事 by たろう » 15年前

変更したので載せます。
参考のサイト通りでやったつもりなのですが、どこが間違っているのでしょうか?
#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;
}

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#41

投稿記事 by softya » 15年前

確認してみました。
なんども書いてますが、UnlhaExtractMemのパラメータが
strcpy(full_file_str,"test.lzh c:");
strcat(full_file_str,ii.szFileName);
で作ったコマンドじゃないとダメですよ。
デバッガでちゃんと引数とか確認してますか?
基本的なことなんですが、基本を疎かにしてはプログラム力は伸びませんし、このやりとりが時間のロスです。
あと、ファイル名に空白を含くむ場合はダブルクオートでコマンドのファイル名を囲む必要があります。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#42

投稿記事 by たろう » 15年前

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:アーカイブファイルを解凍してメモリーに保持することは可能?

#43

投稿記事 by たろう » 15年前

変更しました。
#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:アーカイブファイルを解凍してメモリーに保持することは可能?

#44

投稿記事 by たろう » 15年前

変更しました。
#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)は出力されませんでした。

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#45

投稿記事 by softya » 15年前

どうみても、最後のコードはfull_file_strをUnlhaExtractMemのパラメータとして使ってませんよ。
なんども書きますが、デバッガで必ず確認してください。
それとコマンドの書式が微妙に違っています。
ヒント:空白
本当に参考サイトと同じ書き方ですか?よく確かめてみてください。
"""" ← これもちゃんと目的の動作してます?

全面的に確認不足がトラブルの原因です。よく確かめましょう。
1.作られた中間データ、文字列はデバッガで必ず確認。
2.引数に問題がないか、これもデバッガで確認。
3.どうしても動かなかったら、手書きで動作を確認。
UnlhaExtractMem(hWnd,"test.lzh c: test.txt",nextdata->str,nextdata->size,NULL,NULL,NULL); 画像

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#46

投稿記事 by たろう » 15年前

すみません。
UnlhaExtractMem(hWnd,full_file_str,nextdata->str,nextdata->size,NULL,NULL,NULL);
でした。
できたというか日本語のファイル名は処理してくれないのでしょうか?
それとも何か見落としているところがあるのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#47

投稿記事 by softya » 15年前

私のところでは問題なく動きます。
いろいろな名前でテストして見ましたか?
あるいは見落としはないですか?
ダメなら、そのダメなファイル名を教えてください。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#48

投稿記事 by たろう » 15年前

新規テキスト ドキュメント.txtと、新規テキスト ドキュメント(2).txt
日本語 日本語.txtです。

ファイル名を「日本語.txt」と「日本語 日本語」にしたら表示されました。
多分半角空白文字を入れるとダメみたいです。

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#49

投稿記事 by softya » 15年前

いえ、私のところでは問題はありません。
>新規テキスト ドキュメント.txt と、新規テキスト ドキュメント(2).txt
>日本語 日本語.txtです。
別の問題の可能性があります。
プロジェクトの構成プロパティの全般で文字セットは、マルチバイト文字になってますか?UNICODEだとまずいですよ。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#50

投稿記事 by たろう » 15年前

文字セットはマルチバイト文字になっています。
気にしなくても大丈夫でしょうか?
一応ソース載せてみます。
#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;
}

それと次は何をすればいいのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#51

投稿記事 by softya » 15年前

基本は出来たのでDXライブラリで画像とテキストを表示するとか、自分で使いたいアーカイブ形式にチェンジするとか自由にしてもらってかまいませんよ。何やりたいですか?
コードは後で確認しておきます。ダブルクオートで囲んでいないのが問題かも。
ちなみに、"\""と書くのが正解です。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#52

投稿記事 by たろう » 15年前

うまくいきました。
ありがとうございます!
>基本は出来たのでDXライブラリで画像とテキストを表示するとか、自分で使いたいアーカイブ形式にチェン>ジするとか自由にしてもらってかまいませんよ。何やりたいですか?
このサイトのアーカイブファイルの解凍ソフトを作りたいです!
http://asobinosusume.com/program/prg_arc.php
ハードル高いでしょうか?
どうすればよいのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#53

投稿記事 by softya » 15年前

大して長いプログラムでも無いので、まずアーカイブ・プログラムの理解とファイル構造の解析を行って見てください。そもそも圧縮かかってないですし。
出力されたファイルをバイナリエディタで覗いていて見るのも良いでしょう。
http://www.vector.co.jp/soft/win95/util/se079072.html

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#54

投稿記事 by たろう » 15年前

出力されたファイルをバイナリエディタで見ましたが、これをどうやって元の形に戻すことができるんでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#55

投稿記事 by softya » 15年前

ファイル構造を理解しないとアーカイブの展開処理を作るのは困難なので、アーカイブ作成プログラムの理解を進めましょう。書き出しの逆を作れば読み出し・展開プログラムになります。
そもそもプログラムは、ちゃんと読まれました?FindNextFileとか、その他のものもご存知の文法や関数しか出てこないと思うんですが違いますか?
ここでもデバッガを駆使して、どの様にfwriteされていくか追いかけてみてください。そしてファイルの、どの部分がアーカイブ構造体のどの部分に該当するか調べてみてください。
まず先頭16バイトは、どんな16進数になってます?

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#56

投稿記事 by たろう » 15年前

返信ありがとうございます。
07 00 00 00 04 09 00 00 3E 00 00 00 6C 69 73 74  ........>...list
です。

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#57

投稿記事 by softya » 15年前

じゃあ、この値の意味をプログラムから解読してみてください。
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:アーカイブファイルを解凍してメモリーに保持することは可能?

#58

投稿記事 by たろう » 15年前

>じゃあ、この値の意味をプログラムから解読してみてください。
>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;
}
すみません。全然わかりません。
どのようにしたらよいのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#59

投稿記事 by softya » 15年前

違いますよ。
アーカイブソフトの解読ですので、
http://asobinosusume.com/program/prg_arc.php
の自作アーカイバのソースコードをみて解析してください。
構造体もarc.zipの中にあるソースコード中に含まれています。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#60

投稿記事 by たろう » 15年前

理解したつもりなのですが、これをどうやって解析すればいいのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#61

投稿記事 by softya » 15年前

>理解したつもりなのですが、これをどうやって解析すればいいのでしょうか?

とりあえず何をfwriteしているか確かめてみてはどうしょうか?
デバッガで確認できます。
私も一日中パソコンの前にいるわけではないので、自分でできることをやってみてください。
今週は、火曜日と金曜日は不在の予定です。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#62

投稿記事 by たろう » 15年前

できました。ありがとうございます。
一つ聞きたいのですが、関係あるんですけどD3DXCreateTextureFromFileInMemory()関数の第二引数のメモリ内のファイルへのポインタとは、画像ファイルをmalloc()関数で画像分のデータを確保したデータにfread()関数で書き込んだデータを入れてそのmalloc()関数した先頭のポインタを入れればいいのでしょうか?

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#63

投稿記事 by softya » 15年前

>できました。ありがとうございます。

アーカイブの展開が出来たと言うことでしょうか?

>一つ聞きたいのですが、関係あるんですけどD3DXCreateTextureFromFileInMemory()関数の第二引数のメモリ内のファイルへのポインタとは、画像ファイルを malloc()関数で画像分のデータを確保したデータにfread()関数で書き込んだデータを入れてそのmalloc()関数した先頭のポインタを入れればいいのでしょうか?

そのはずです。なにか問題がありましたか?

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#64

投稿記事 by たろう » 15年前

はい。単純に考えてみたらできました。
いろいろ助言ありがとうございました!
>そのはずです。なにか問題がありましたか?
いいえ。合っているのならいいです。
ありがとうございます!

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#65

投稿記事 by たろう » 15年前

すみません。このエラーはどうしたら消えるのでしょうか?
main.obj : error LNK2019: 未解決の外部シンボル _D3DXCreateSprite@8 が関数 _WinMain@16 で参照されました。
main.obj : error LNK2019: 未解決の外部シンボル _D3DXCreateTextureFromFileA@12 が関数 _WinMain@16 で参照されました。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#66

投稿記事 by たろう » 15年前

すみません。解決したので別の質問をします。
このプログラムで画像ファイルを出力しようとしたのですが、
表示されません。なぜでしょうか?

#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;
}
です。よろしくお願いします。

softya

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#67

投稿記事 by softya » 15年前

すいません、今日も無理そうなんで。
ここは解決にして、別質問してもらえますか?
どう、うまく表示されないか書き添えてください。
出来ればプロジェクト全体(debug/Releaseフォルダ内容は不要)をアップロードすると回答してくれる人が楽です。

Justy

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#68

投稿記事 by Justy » 15年前

 多分 IDirect3DDevice9::Presentが呼ばれてないんじゃないかと思いますけど。

 全くアーカイブに関係ないのであれば、softyaさんの仰るとおり別スレした方がいいですね。

たろう

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#69

投稿記事 by たろう » 15年前

softyaさんありがとうございます。
解決します。本当にありがとうございました。

Justyさんありがとうございます。
言われたとおりやってみたらうまくいきました。
ありがとうございました。またわからないことがあるので別スレに書こうと思います。


Justy

Re:アーカイブファイルを解凍してメモリーに保持することは可能?

#71

投稿記事 by Justy » 15年前

 なにやら投稿がダブっていたので削除しました。 画像

閉鎖

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