アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

よろしくお願いします

A 回答 (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;

// この後、データヘッダを読み込みます
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/03/22 19:31

アセンブラと違いCではコンパイルしてみないと


自分自身のサイズがわからないので
一度コンパイルしてからサイズを知り
その後に読み書きするデータを付加するしかないのでは。

とりあえずソースの中では大きめのアドレスをもたせておいて
データ付加の際のりしろ部分をつけてはどうでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます
確保した領域が連続なのかどうか
確保した領域がexeファイルの中の後ろの部分に取られるのかどうか
が問題ですね

void main(void)
{
char data[10000000];
unsigned data_size;
・・・・・・・・・・・・・
}

においてdata_sizeの位置がわかり
dataが連続に後ろの部分に作られれば
そのエリアに上書きできるのでいいのですが・・・・

お礼日時:2003/03/22 18:17

char a[]=*********;


int b[]=*******;

 main()
{
}

のように、最初にデータを書いておけば、
コンパイルとリンクの後には
外部データとして
プログラムの最後の部分に
配置されるのではないでしょうか?

外部データの配置される部分のことは
マイクロソフトのアセンブラの本意書いてあったかな?

詳しいことは忘れました。

この回答への補足

void main(void)
{
char *data;
unsigned x;
.................................

data=new char[x];
........
........



.................................
delete[]data;
}

においてコンパイル後xのアドレスがプログラムの最後の次のアドレスになり
dataの領域確保でdataのアドレスがその4バイトあとのアドレスになれば言いのですが・・・

補足日時:2003/03/21 18:02
    • good
    • 0

それはコンパイル後の物を読みとるのでしょうか?それともコンパイル前のソースコードのことを言っているのでしょうか?




前者であればCは構造的にコンパイルしてリンクする形になるのでなかなかそういったことは難しいのではないかと思います。

後者であればSTATIC領域にデータを納めるようなサブルーチンを一番最後においてやれば何とかなるかもしれませんね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/03/21 18:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!