プログラムがあります。
このプログラムを書いているのは
自分ではありませんが、このプログラムの
上に、ボタン等を配置したいと思います。
他の起動しているプログラムの上へ、
オブジェクトを配置する手法を
教えてください。
http://e-words.jp/w/E98086E382B3E383B3E38391E382A4E383AB.html
逆コンパイルとは 【decompile】 ─ 意味・解説 : IT用語辞典 e-Words
Borland C++ Builderは使った事がないので詳しくはわかりませんが、
おそらく、独自のクラスライブラリを使い、RAD開発を行っているのだと思います。
そのクラスライブラリは、当然WinAPIから構成されているのだと思います。
ですので、おそらく逆コンパイルは難しく、リバースエンジニアリング的な手法での改造はきついだろうと思います。
http://techtips.belution.com/ja/vc/0008/
ウィンドウをサブクラス化するには?
ですが、現在起動しているアプリケーション上にボタンを配置する事は出来ます。
それにはまず、WinAPIのFindWindowやWindowFromPointなどの関数を使ってウィンドウハンドル(以下hWnd)を取得します。
次に、このhWndを親ウィンドウに、WS_CHILDスタイルでの”Button”を作成すればいいだろうと思います。
が、このままではボタンからのイベントを受け取る事ができません。
そこで、(いろいろな方法があるのですが)サブクラス化という手法を使うのがいいのではないかと思います。
詳細については、上記URLを参考にしてください。
自前環境(C++&WinAPI、WinXP SP2)で確認してみたところ上手くいきました。
http://techtips.belution.com/ja/vc/0026/
同じプロセスに属していないウィンドウの属性を ( SetWindowLong() で ) 変更するには?
追加情報として、
実際、現在起動しているプロセスに関してはある程度コントロールする事が出来るのですが、この時、やはりある程度は制限を受けてしまいます。(スタイルの変更など。)
そこで、その制限をある程度緩和させるために使われる事のある手法の一つとして、WinAPIのSetWindowsHookExを使った、他プロセスへの内部進入、という方法があります。
ご参考までに。
(サブクラス化ではなく、この手法を使い、内部メッセージを取得するという方法もあります。)
http://www.tim.hi-ho.ne.jp/t-inukai/cprog02.html
T's Square 第2回 ほかのソフトにまかせよう
当方,一応プログラマなのですが,質問の正確な意味が把握しかねますので,とりあえず想像で答えてみます。
以下の前提条件です。
(1)Borland C++ Builderで書かれている
プログラムは,すでに存在し実行体形式である。(コマンドで実行できる)
(2)自分はこれから,このプログラムを画面インターフェイスを使って起動をしたい。
※画面インターフェイスにはボタンを配置し,このボタンをクリックするとプログラムが実行される。
実装方法は,まず画面を作成する。(VC++ならウイザードで作成)
ボタンを配置してオンクリックイベント関数からSPAWNV関数によって目的のプログラムを呼び出す。
以下参考プログラムです。
void CCRTFILDlg::OnOK()
{
char command_line[256];
sprintf(command_line,”%s¥¥crtcsvfile.exe %s %I64u %I64u”,env,Crt_Fil,Rec_Num[1],Itm_Num);
ExecStart(command_line);
}
///////////////////////////////////////////////////////////////////////////////
// コマンド実行
///////////////////////////////////////////////////////////////////////////////
ExecStart(char *command_line) {
char *exec_arg[12];
int ix1,ix2,spc;
int str_len;
int rtn_code;
spc = 0; ix2 = 0; str_len = strlen(command_line);
for (ix1=0;ix1<12;ix1++){ exec_arg[ix1] = NULL; }
for (ix1 = 0; ix1 < str_len; ix1++) {
if (ix1 == 0) {
exec_arg[ix2] = command_line; ix2++;
} else {
if ((command_line[ix1] == 0x20) && (spc == 0)) {
spc = 1;
command_line[ix1] = 0x00;
} else {
if ((command_line[ix1] != 0x20) && (spc == 1)) {
spc = 0;
exec_arg[ix2] = &command_line[ix1]; ix2++;
}
}
}
}
rtn_code = spawnv(P_NOWAIT,exec_arg[0],exec_arg);
return(rtn_code);
}
※目的違いでしたら,ポイント不要です。
うーん、ちょっと違います。。
やりたいことのニュアンスとしては
1番の回答者さんのような感じです。
サブクラス化以外の方法をはじめて聞きました。
ありがとうございます。