人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Borland C++ Builderで書かれている
プログラムがあります。

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

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

●質問者: mikasa_zzt231
●カテゴリ:コンピュータ
✍キーワード:Borland Builder C++ オブジェクト プログラム
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● lupu
●40ポイント

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

ご参考までに。

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

◎質問者からの返答

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

ありがとうございます。


2 ● goldman
●10ポイント

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番の回答者さんのような感じです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ