• ベストアンサー

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

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

  • nubou
  • お礼率62% (293/470)

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

  • ベストアンサー
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

  • PICプログラム C言語とアセンブラ言語

    PIC18シリーズを使用して、プログラミングをしています。コンパイラはCCS-Cです。今まではすべてC言語で書いてきたのですが、アセンブラでしか設定ができない部分があり、今までのC言語のソースに加えてアセンブラを組み合わせようと思っているのですが、C言語とアセンブラを組み合わせることは可能なのでしょうか?

  • 大学の卒業研究で以下のようなプログラムを作成することになったのですが、情報が少なく困っています。

    大学の卒業研究で以下のようなプログラムを作成することになったのですが、情報が少なく困っています。 「仮想マシンのアーキテクチャを定義、C言語でアセンブリ言語のプログラム をマシンコードに変換するプログラムを作成」 C言語については勉強済み。 アセンブラについては検索するとたくさん情報は得られるのですが、C言語でアセンブラを作るとなると話は別で。 どんな検索ワードで検索すればいいのか?などさっぱりです。 卒業研究なので、自分で考えるべきなのでしょうが・・・ どなたか、これに関連したサイト、実際にC言語で書かれたプログラム等をご存じでしたら、教えて頂けないでしょうか

  • プログラムとコンピュータ内部の物理的(?)な連携について

    C言語を使って、プログラミング作業をしている者です。 今、私は実務を通してC言語を使ったプログラミングを勉強している最中なのですが、自身で作成する場合は勿論ですが、他人が作ったプログラムを修正したりしていると、メモリの取られ方を意識して(或いはそのつもりで)、コーディングされているか(するか)イメージが掴みきれません。 VCを使って値だけの変化は分かりますが、変数がどんな時に(場所が複数ある場合)どこに確保されて、、、といったことがどうも分かりません。 C言語でのプログラムを理解するにはアセンブラ構造(スタックなど)を知っていれば、知らないよりは理解し易いと知り合いに言われ、本屋などで探しているのですが、イメージが掴みやすいように書かれているのがなかなか見当たりません。  C言語での命令を受けてCPUがどう動いているか(或いはどう動かされるように出来ているか)について何か「これは役に立った」とかそういった参考書なりサイトなりありましたらお願いいたします(今、「機械のコトバ」という書籍を読んでいます)。  過去ログでは近いと思い「アセンブラ」で検索してみましたが、「どうやってアセンブラ文法を学べばいいか」といったプログラミングそのものが殆どでした。  また、(まずは上記のことからですが)CPUだけでなくOSの役割についても知りたいので、何か良い参考書がありましたらそれについてもお願いいたします。

  • 変換プログラムってどうやって作るのですか??c言語超初心者です。おねがいしますm(__)m

    大学の課題で、「カレンダのデータをiモードで見れるようにする変換プログラムを作りなさい」というのが出されたのですが、正直なんのことだかさっぱりわかりません(汗) 私なりに一生懸命考えた限りはこうです▽ ・文字コード変換プログラムをつくればいいのかな? ・もしくは、データベースをiモードでみれるようにするようにタグを付け加えていくプログラムかな? 環境はUNIXのC言語です。 c言語はまったくの初心者なので文字コード変換プログラムとかもつくれないです。どうか助けてください。

  • Cでアニメーションプログラムをつくりたい

    時間t x座標 y座標 0.0  0   0 0.1  1.0  -1.0 0.2  1.5  -1.5 0.3  2.0  -2.0 ・ ・ ・ ・ のようなデータファイルがあったとき、これを読み込んで図形(例えば円)をデータの通りに動かすCプログラムをつくりたいのですが、どうすればいいのでしょうか? 具体的なコードを書いて頂けると大感謝なのですが、例えば「〇〇というAPI関数を使って、forループを使ってこんな風に書けばいいんじゃない」というような感じの指針を頂けるだけでも構いません。よろしくおねがいします。 ちなみに、さっきやっとウィンドウを出せたばかり、という状況です。 環境はWindows98SEです。 あと、WindowsのAPIのリファレンスってWeb上にないのでしょうか?(ちょっと検索したのですが、書籍しか見つかりませんでした…)

  • アセンブリ言語は原始プログラムですか?

    質問(1) アセンブリ言語というのは、 add $S1, $S2 みたいなやつですよね? wikipediaで「ソースコード(ソースプログラム、原始プログラム)」の注釈1,2を読むと、 注1:【機械語の命令に記述するアセンブリ言語(アセンブラ)が存在するが、このアセンブラ用の文字列で記述されたプログラムはソースコードとは呼ばれないのが普通である。】 注2:【アセンブリ言語で書かれたプログラムはソースコードと呼ばれない】 と書かれてあります。 でも、 他の教材では アセンブリ言語で書かれたプログラム(原始プログラム) と書かれています。 どっちが正しいのでしょうか? 質問(2) 目的プログラム(オブジェクトプログラム)とは、 IT用語辞典によると 【オブジェクトプログラムとは、ソースプログラム(人間が認識できるプログラム言語で高水準言語など?)をコンパイラで機械語に翻訳したプログラムのことである】 とありますが、 ソースプログラムをコンパイラで翻訳するとアセンブリ言語になるんではないのですか? そのアセンブリ言語をアセンブラで翻訳して機械語になるのではないのでしょうか? どなたかご教授ください。 お願いします。

  • C言語のvoid型ポインタ変数について。

    C言語のvoid型ポインタ変数について。 C言語のvoid型ポインタ変数について質問があります。 組み込み系の開発を行っているのですが、現在使用しているシステムで、 提供されている "API" を介してアプリケーション部のソフト作成を行っています。 この "API" ですが、引数の多くはvoid型ポインタとなっています。 ある人がこの引数がvoid型となっているのを見て、 『なんでvoid型なんや??、C言語でアセンブラと違うんやから、void型なんかにしない方が良い』 とおっしゃいました。 この意味がよくわからなかったのですが、なぜ void型はよろしくないんでしょうか? -- 僕が思うに、APIなんやから引数を void型ポインタ にすることでどんな型にも対応できる 汎用的であると感じ、逆にこの方が良いのではと感じたのですが。。 -API例---- int _exApiKannsuu( char in_data, void* out_data ) "in_data" をもとに "out_data" を取得する。 どーやらこの "out_data" が void型 であるのががよくないらしい・・

  • PICに書き込むプログラムや変数の容量を少なくする方法

    16f877のpicマイコンでプログラミング作業を行っています もともとPC上でのソフト開発がメインだったので マイコンプログラムはいろいろ制約があり大変です 現在C言語によってプログラムを書いているんですが ccscでコンパイルすると容量不足でエラーがでます not enough ram for valiaホニャララ 等がよく出ます。 マニュアルを読むと変数を減らせとかいろいろ書いてありますが 減らしても改善できません。 知人に聞くとアセンブラで書くといいよと言われましたが アセンブラはわからないのでCじゃないとだめです なにか容量をあまり取らないコーディングやその他のテクニックをご存知の方 教えてください、お願いします。 また、参考になる書籍やURL等がありましたら教えてください

  • プログラム言語って何があるの?

    私、プログラム言語について調べています。 ウィキペディアをみてもたくさんあって、そこからまたリンクがたくさんあってどこでどのように区切っていいのか分かりません。そこで皆さんに質問したいのですが、プログラム言語はどのようなものがありますか? 大まかにプログラム言語の総称があってその次に (1)機械語(マシン語) (2)アセンブラ言語 高水準言語これの中に (3)インタプリタ言語 (4)コンパイラ言語がありますが、 (1)~(4)のそれぞれの詳細を教えてください。例:BASIC、C等 またこの枠に入らないプログラム言語がありましたら教えてください。 とってもマイナーなものでも構いません。出来ればURL欲しいです。 お願いします。m(_ _)m

  • PICライタ (C言語→HEXファイル)

    今PICライタについて独学で勉強しています。 今ソフト的には秋月のPICライタおよび、MPLAB使ってます。 しかし、MPLABがC言語読み込めないため迷っています。 そこで質問なんですが (1) C言語をアセンブラ言語に変換する無料ソフトありますか? (2) (1)をあきらめたとしてアセンブラ言語で書くとして、アセンブラ言語でPICのプログラム書くための、わかりやすい本などご存知ですか? やっぱりCコンパイラを買うしかないのでしょうか??

専門家に質問してみよう