CABファイルのヘッダ構造体について。

[戻る]
める 2007/06/20(水) 02:59:02
お世話になります。
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です。

める 2007/06/20(水) 09:47:57
おはようございます。

エラー部分はこうです。
「error C2027: 認識できない型 'CFHEADER' が使われています。」
でした。

で、
struct CFHEADER *aaa;
の部分を
struct CFHEADER aaa;
にしたところ、
「error C2079: 'cffile' が 未定義の struct 'CFFILE' で使用されています。」

と出ました。要は構造体の宣言が無い訳で・・・使える訳ありませんね。
しかし何故ポインタとしての宣言だと、
定義が無いのにも関わらずエラーにならないのでしょうか?

tetrapod 2007/06/20(水) 10:30:47
とりあえずこっちを先に
struct cffile; というのは「構造体の(先行)宣言」というやつ。
名前だけわかって詳細がわからない型を不完全型というが、それ。
構造体の詳細が不明なままであっても cffile という名前がが構造体であることがわかれ
ば
cffile を指すポインタや参照を作ることができるので、そういう場合に使われる。

んで cabsdk の中を見てみたけど CFFILE や CFHEADER は用意されてないね。
ドキュメントのほうにもこう書いてあるので当然。

「C の構造体に似た方式で記述したフォーマットを用いて解説する」
# padding/alignment を行わないものとする

つまり struct CFFILE のソースコードを与えたとしても padding/alignment が行われる
と
ファイルフォーマットと不一致になるので意味が無い (からソースは無い) ということら
しいぞ。
実際 szCabinetPrev 等はあるかないかわからないし、あっても事前にはサイズがわから
ないので
struct で記述するのは無理っつーことだ。

める 2007/06/20(水) 11:09:58
[[解決]]
レスありがとうございます。

>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 を行わないものとする

英語が苦手でそんな事が書いてあったとは露知らず・・・
構造体表記があったのでてっきりあるものだと信じ込んでました。
しっかり読み込まないと駄目ですね。お恥ずかしい限りです。
固定部分を読むルーチンを作る事にします。
ホントに助かりました。ありがとうございました。

古いスレッドには追加発言できません。