• ベストアンサー

C/C++でデータをプログラムの後につけたい

アセンブラだとコードの後にデータをつけるようなことがたやすくできますが C言語系(API)でプログラムの後にデータをくっつけるようなコーディングはできるのでしょうか? プログラム部分では尻のデータにアクセスするようにします よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.4

Windowsの実行ファイルにデータファイルをアペンドしても、実行時には元々の実行ファイルの部分しかマッピングされないので、アセンブラで書いても無意味です。 一般的には、自分自身を普通のファイルとしてオープンし、必要な部分を読み込むようにします。 PEヘッダの説明は面倒なので、アペンドされた位置までシークさせるサンプルを載せます。 TCHAR* path = new TCHAR[MAX_PATH]; GetModuleFileName(NULL, path, MAX_PATH); HANDLE file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); delete path; IMAGE_DOS_HEADER* idh = new IMAGE_DOS_HEADER; DWORD read; ReadFile(file, idh, sizeof(IMAGE_DOS_HEADER), &read, NULL); SetFilePointer(file, idh->e_lfanew, NULL, FILE_BEGIN); delete idh; IMAGE_NT_HEADERS* inh = new IMAGE_NT_HEADERS; ReadFile(file, inh, sizeof(IMAGE_NT_HEADERS), &read, NULL); SetFilePointer(file, sizeof(IMAGE_SECTION_HEADER) * (inh->FileHeader.NumberOfSections - 1), NULL, FILE_CURRENT); delete inh; IMAGE_SECTION_HEADER* ish = new IMAGE_SECTION_HEADER; ReadFile(file, ish, sizeof(IMAGE_SECTION_HEADER), &read, NULL); SetFilePointer(file, ish->PointerToRawData + ish->SizeOfRawData, NULL, FILE_BEGIN); delete ish; // この後、データヘッダを読み込みます

nubou
質問者

お礼

ありがとうございます 一旦締め切って疑問が出てきたらまた質問しますのでよろしくお願いします

その他の回答 (3)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

アセンブラと違いCではコンパイルしてみないと 自分自身のサイズがわからないので 一度コンパイルしてからサイズを知り その後に読み書きするデータを付加するしかないのでは。 とりあえずソースの中では大きめのアドレスをもたせておいて データ付加の際のりしろ部分をつけてはどうでしょうか。

nubou
質問者

お礼

ありがとうございます 確保した領域が連続なのかどうか 確保した領域がexeファイルの中の後ろの部分に取られるのかどうか が問題ですね void main(void) { char data[10000000]; unsigned data_size; ・・・・・・・・・・・・・ } においてdata_sizeの位置がわかり dataが連続に後ろの部分に作られれば そのエリアに上書きできるのでいいのですが・・・・

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.2

char a[]=*********; int b[]=*******;  main() { } のように、最初にデータを書いておけば、 コンパイルとリンクの後には 外部データとして プログラムの最後の部分に 配置されるのではないでしょうか? 外部データの配置される部分のことは マイクロソフトのアセンブラの本意書いてあったかな? 詳しいことは忘れました。

nubou
質問者

補足

void main(void) { char *data; unsigned x; ................................. data=new char[x]; ........ ........ ................................. delete[]data; } においてコンパイル後xのアドレスがプログラムの最後の次のアドレスになり dataの領域確保でdataのアドレスがその4バイトあとのアドレスになれば言いのですが・・・

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

それはコンパイル後の物を読みとるのでしょうか?それともコンパイル前のソースコードのことを言っているのでしょうか? 前者であればCは構造的にコンパイルしてリンクする形になるのでなかなかそういったことは難しいのではないかと思います。 後者であればSTATIC領域にデータを納めるようなサブルーチンを一番最後においてやれば何とかなるかもしれませんね。

nubou
質問者

お礼

任意の長さのデータを制御するexeファイルを作っていて exeファイルの後にデータ容量がヘッダとしてついているデータ(ヘッダとしてデータの大きさも)をくっつけるだけでデータを処理できるものです 例えば .exeファイルは画像を表示する実行ファイルで .dataファイルは画像データで .exeと.dataをくっつけるプログラムgoo.exeを作っておいて goo.exeが両者を合体して自己表示画像データ(合体後.exeになる)を作れるようにしたいのです

関連するQ&A