お世話になります。
CABファイルを扱う構造体についてお聞きしたいのですが・・・
まずCABファイルを扱う為下記のSDKをDLしました。
http://support.microsoft.com/default.aspx?scid=kb;ja;310618
この中のCABFMT.DOCと言うドキュメントにCABファイルのヘッダ仕様があり、
ヘッダ部分は「CFHEADER」構造体でファイル情報は「CFFILE」構造体で
取得出来ると言う事がわかりました。
このファイル情報に含まれているパス名+ファイル名を取得したかった為、
この2つの構造体を用いて取得しようと思い、以下の様なソースを書きました。
(一部抜粋)
char *pFile・・・CABファイルを読み込んだ後のポインタです。
char *pWork;
pWork = pFile;
struct CFHEADER *aaa;
aaa = (CFHEADER*)pFile;・・・☆
pWork += aaa->coffFiles;(ファイル情報の先頭オフセット)
struct CFFILE *bbb;
bbb = (CFFILE*)pWork;・・・☆
ビルドをすると☆の位置で有効な構造体では無い旨のエラーが出ます。
(今、自宅に環境が無いので詳細な文言失念してしまいました。)
そこで敢えて☆行をコメントにするとビルドは通ります。
CFHEADERの定義を見よう思い、CFHEADERの所で右クリックで
「CFHEADERの定義位置を表示」としたのですが表示されません。
DLしたSDKのファイル群及びVCのインストールフォルダの中で
「CFHEADER」の検索も掛けたのですが定義されている様子もありません。
唯一見つかったのはLIBファイルの中に含まれている様なのですが・・・
(CFFILE構造体の場合も全く同じ状態です。)
普通は提供されるヘッダに入っているものだと勝手に思い込んで
いるのですが、これはそういうパターンもある。という事なのでしょうか?
またそうであるならば、どのような対応をすれば動作するようになるのか
ご教授頂けたらと思います。
説明ベタで長文になってしまいましたが宜しくお願いします。
環境はVC6(SP5)W2Kです。
おはようございます。
エラー部分はこうです。
「error C2027: 認識できない型 'CFHEADER' が使われています。」
でした。
で、
struct CFHEADER *aaa;
の部分を
struct CFHEADER aaa;
にしたところ、
「error C2079: 'cffile' が 未定義の struct 'CFFILE' で使用されています。」
と出ました。要は構造体の宣言が無い訳で・・・使える訳ありませんね。
しかし何故ポインタとしての宣言だと、
定義が無いのにも関わらずエラーにならないのでしょうか?
とりあえずこっちを先に
struct cffile; というのは「構造体の(先行)宣言」というやつ。
名前だけわかって詳細がわからない型を不完全型というが、それ。
構造体の詳細が不明なままであっても cffile という名前がが構造体であることがわかれ
ば
cffile を指すポインタや参照を作ることができるので、そういう場合に使われる。
んで cabsdk の中を見てみたけど CFFILE や CFHEADER は用意されてないね。
ドキュメントのほうにもこう書いてあるので当然。
「C の構造体に似た方式で記述したフォーマットを用いて解説する」
# padding/alignment を行わないものとする
つまり struct CFFILE のソースコードを与えたとしても padding/alignment が行われる
と
ファイルフォーマットと不一致になるので意味が無い (からソースは無い) ということら
しいぞ。
実際 szCabinetPrev 等はあるかないかわからないし、あっても事前にはサイズがわから
ないので
struct で記述するのは無理っつーことだ。
レスありがとうございます。
>struct cffile; というのは「構造体の(先行)宣言」というやつ。
>名前だけわかって詳細がわからない型を不完全型というが、それ。
不完全型ですか・・・初めて聞きました。ちょっと調べてみました。
(引用元) http://d.hatena.ne.jp/computermonkey/searchdiary?word=*%5B%B7%BF%5D
#include<stdio.h>
main(){
struct b; //*タグだけ先に宣言*//
struct a{
struct b *bb;
};
struct b{
struct a *aa;
};
}
とタグだけ先に宣言してやると良い。
タグだけ宣言された時点ではその内容が分からない。
もちろんサイズも決められない。このような型を不完全型という。
サイズが決められないことにより、不完全型は変数や配列を取ることが出来ない。
ただしポインタだけは取ることが出来る。
--------------------------------------------------------------
こういった使い方したこと無いので知りませんでした・・・。
構造体や共用体の以外に「サイズが決まらない」なんて事は
あるのでしょうか・・・?char a[];なんて定義出来ませんし・・・。
割と一般的に使われてるものなんでしょうか?
しかし、これが本題ではないので別途調べようと思います。
>「C の構造体に似た方式で記述したフォーマットを用いて解説する」
># padding/alignment を行わないものとする
英語が苦手でそんな事が書いてあったとは露知らず・・・
構造体表記があったのでてっきりあるものだと信じ込んでました。
しっかり読み込まないと駄目ですね。お恥ずかしい限りです。
固定部分を読むルーチンを作る事にします。
ホントに助かりました。ありがとうございました。