プログラム実行中にプログラムを書き換えるには?

このQ&Aのポイント
  • プログラム実行中に、プログラムの一部を書き換えて保存する方法を教えてください。
  • プログラムを書き換えて実行中に更新する方法を教えてください。
  • プログラム実行中に、プログラムの特定の部分を変更して実行結果を反映させる方法を教えてください。
回答を見る
  • ベストアンサー

プログラム実行中にプログラムを書き換えるには?

実行中のプログラムの中でそのプログラムの一部を書き換えて保存するにはどうすればいいですか? 例えば次のようなプログラムの場合、このプログラムの中でTEXT("最初の文字列");の部分の文字列を別な文字列に変更しプログラムを更新したいです。 (プログラム終了後にもう一度実行すると「moji[20]=」の部分は前回実行時に書き換えた文字列が代入されているようにしたい) #include<windows.h> int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int ncmdshow){ TCHAR moji[20]=TEXT("最初の文字列"); MessageBox(NULL,moji,TEXT("文字列表示"),MB_OK); return 0; } --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

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

  • ベストアンサー
回答No.6

実行中のファイルは、Windowsによってロックされているため、書き込みを行うことはできません。 また、文字列部分のみを書き換えても、実行ファイルが破損していないかチェックするための値があり、実行時にチェックされるため、ファイルが壊れていると判定されて実行できなくなります。 他の方法を考えましょう。

nazoda
質問者

お礼

回答ありがとうございます。参考になりました。

その他の回答 (7)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.8

#4,#7です。 あと、自己解凍ファイルなどで使われている方法ですが、EXEファイルの後ろにデータを追加する方法があります。 ただ、実行中の自分自身のEXEファイルを書き換えることはできないので、バッチファイルなどを使うことになるので、余計なファイルを作らないという方針からは遠ざかりますね。

nazoda
質問者

お礼

いろいろな方法を教えていただきありがとうございました。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.7

#4です。 ファイルを作りたくないのであれば、レジストリを使うのもいいと思います。 最近はあまり流行らないようですが、使用には問題ないはずです。

回答No.5

初期値変更だけのために、ソース書き換えてコンパイルなんてトリッキーなことしなくても 変更時や終了時にINIファイルに次回の初期値を保存しておいて 再実行時にはGetPrivateProfileInt()とかを使って INIファイルから初期値を読み込むようにプログラムするだけでよいのでは?

nazoda
質問者

お礼

回答ありがとうございます。余計なファイルは増やさないで1つのファイルにしたかったのですがやはりそれが無難な方法のようですね。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

そんなことは無理なので、通常はiniファイルとかを使います。 http://wisdom.sakura.ne.jp/system/winapi/win32/win156.html

nazoda
質問者

お礼

回答ありがとうございます。いい方法がない場合はiniファイルの方法でやってみたいと思います。

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.3

APIフックでいいのでは。

参考URL:
https://gist.github.com/kumatti1/3dd953e6272f176469bb
nazoda
質問者

お礼

回答ありがとうございます。APIフックについてはまだ全然わからないのでこれから勉強してみたいと思います。

  • yama1718
  • ベストアンサー率41% (670/1618)
回答No.2

普通の方法は、メインのプログラムからアップデート用のサブプログラムを起動してメインは終了させます。 サブプログラムはメインプログラムを書き変えてから(多くは最新版をネットからダウンロードして上書きしたり、パッチを当てたり)、メインを再起動します。 質問のプログラム中の文字列だけを書き変えるならリソースをいじる事になりますね。 プログラムの自己書き変えは昔はよく使われていたけど、一つ間違えば暴走するリスキーな方法ですし、ウィルスやマルウェアなどの不正プログラムが行う動作と同じなので、最近ではOSやシステムが保護してブロックしたり警告が出たりします。

nazoda
質問者

お礼

回答ありがとうございます。参考になりました。

  • notnot
  • ベストアンサー率47% (4845/10256)
回答No.1

ソースプログラムを書き換えた後、コンパイルし直さないといけないということは認識されていますか? 普通は、別ファイルにして読み込みます。

nazoda
質問者

お礼

回答ありがとうございます。出来上がったexeファイルには変数の値が書き込まれている部分があると思うのでそこを書き換え、上書きすればいいと単純に考えたのですが、それは無理なのですね。

関連するQ&A

  • HINSTANCEの型

    LPSTR は char* なので、 int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , LPSTR lpCmdLine ,int nCmdShow ) を int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , char* lpCmdLine ,int nCmdShow ) と書き換えてもコンパイルできます。 HINSTANCEはvoid *型だという記述を見たのですが、void *で書き換えてもエラーがでてしまいます。 どうしたらよいのでしょうか。

  • ダイアログ表示後に1回だけ実行

    ダイアログベースのプログラムで、ダイアログを表示後にメッセージボックスを表示しようとして、下のプログラムのようにしたのですがダイアログが表示される前にメッセージボックスが表示されてしまいます。 ダイアログが表示された直後に1回だけ表示されるようにするにはどうすればいいですか? #include<Windows.h> #include "resource.h" HINSTANCE hinst; INT_PTR CALLBACK dlgproc(HWND,UINT,WPARAM,LPARAM); int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { hinst=hInstance; DialogBox(hinst,TEXT("mydlgmain"),NULL,dlgproc); } INT_PTR CALLBACK dlgproc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) { TCHAR moji[]=TEXT("ダイアログ表示"); switch(msg) { case WM_INITDIALOG: MessageBox(hwnd,moji,TEXT(""),MB_OK); return(INT_PTR)TRUE; case WM_CLOSE: EndDialog(hwnd,LOWORD(wp)); return (INT_PTR)TRUE; } return(INT_PTR)FALSE; } --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • 画像が出力されません

    画像出力するには int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); から引数"lpCmdLine"を使うことにより画像が出力できる事を聞いたのですが本当でしょうか? うまく出力できません どのようにしたらよいのか具体的にソースをつけて教えてください。 画像はraw画像で出力します

  • 外部シンボル "_main"は未解決です

    「LIBC.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です」というエラーが発生しましたが、何をみればいいのかわかりません。int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )がソースについています。

  • lpCmdLineについて

    #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { MessageBox(NULL , lpCmdLine , TEXT("Kitty") , MB_ICONINFORMATION); return 0; } とやったのですが、lpCmdLineのパスが表示されません。なぜでしょうか?

  • VS2019でWinMainエラー発生

    以下メッセージを表示するだけのプログラムですが、以前はビルドできたのですが、VS2019になってからWinMainで「整合性のないインスタンス・・・」とエラーが出ます。なんででしょうか。 お願いします。 またVCをVBSみたいに黒い画面が出ずに引数を使用したいですが、その他アドバイスもお願いします。 #include <windows.h> int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MessageBox( NULL, TEXT("Hello, world!"), TEXT("Hello"), MB_OK | MB_ICONINFORMATION ); return 0; }

  • AppleScriptでプログラミング

    私は最近C言語のプログラミングに興味を持ち、Mac os 10.3.9に入っていた「AppleScript」の中の「スクリプトエディタ」で、インターネットで見つけた文字列、例えば下の #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ if( DxLib_Init() == -1 ) return -1; WaitKey() ; DxLib_End() ; return 0 ; } などを打ち込んでみたのですが、さっぱりコンパイルできません。 なにしろ初心者なもので、何がなんだかさっぱり分からず困っています

  • windowsプログラム、文字化けする

    windowsプログラム、文字化けする 最近になってwindowsプログラムに興味を持ってやってみようと思い サイトでいざ勉強しようと思ったんですが、サンプルコードをVC++2008で コンパイル実行してみると、すべて文字化けしています。なぜでしょう ちなみにOSはXP、サンプルコードてのが #include <windows.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "Hello World!", "メッセージ", MB_OK); return 0; } メッセージボックスでの文字表示のサンプルみたいですがどうもうまくいきません もう1つ このサンプルをソースファイルの拡張子cppでやるとエラーがでるんですがcだと警告が出るだけなんですが これはいったいなんででしょうか。 すみません、最近こういう勉強を始めたばかりなので。

  • spawnl

    #include "stdafx.h" #include <process.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // TODO: この位置にコードを記述してください。 _spawnl(_P_WAIT, "chkbook.exe",...); return 0; } 上のようにして、MFCサンプルの ckhbook.exe  (引数はありません。) を呼び出そうとしましたが、上手く動きません。  どのように修正すれば良いのでしょうか?  コンソールプログラムの場合は、 簡単に呼び出せます。  よろしくお願いいたします。

  • Windowsゲームプログラミングを始めたのですが

    最近ゲームのプログラムを始めた者です。 C言語でWindowsプログラムを書き始めたのですが、最初の宣言を行った時点でコンパイル時に大量のエラーが出てしまいました。 ↓が内容です。 #include<windows.h> #include<stdio.h> #include<stdlib.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ } 使用OSはVistaです。 急いではいないので、どなたか解決法を知っている方、ご指導お願いします。

専門家に質問してみよう