Borland C++ Builderで書かれている

プログラムがあります。

このプログラムを書いているのは
自分ではありませんが、このプログラムの
上に、ボタン等を配置したいと思います。

他の起動しているプログラムの上へ、
オブジェクトを配置する手法を
教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:lupu No.1

回答回数214ベストアンサー獲得回数0

ポイント40pt

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を使った、他プロセスへの内部進入、という方法があります。

ご参考までに。

(サブクラス化ではなく、この手法を使い、内部メッセージを取得するという方法もあります。)

id:mikasa_zzt231

サブクラス化以外の方法をはじめて聞きました。

ありがとうございます。

2005/06/28 07:19:04
id:goldman No.2

回答回数86ベストアンサー獲得回数0

ポイント10pt

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);

}

※目的違いでしたら,ポイント不要です。

id:mikasa_zzt231

うーん、ちょっと違います。。

やりたいことのニュアンスとしては

1番の回答者さんのような感じです。

2005/06/28 07:31:26

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません