2つのexeの間で値の受け渡し

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ツンドラ

2つのexeの間で値の受け渡し

#1

投稿記事 by ツンドラ » 9年前

毎度お世話になっております。ツンドラと申します。

C++builderを用いてアプリケーション開発をしています。
2つのexeの間で値の送受信が必要となり、通信の方法を調べていました。

そこでこちらのサイトを発見したのですが、エラーで行き詰りました。
http://bcb.client.jp/tips/022_receive_postmessage.html

<Send.exe(送信側) | Unit1.cpp>の

コード:

// アプリのタイトルからウィンドウハンドルを取得します
	HWND hwnd = FindWindow(NULL, AppTitle.c_str());
というところで、

E2034 'char *' 型は 'const wchar_t *' 型に変換できない
E2342 パラメータ 'lpWindowName' は const wchar_t * 型として定義されているので char * は渡せない

というエラーが出ました。
型が違うことによるエラーなのはわかったのでキャストなどしてみたのですが状況が改善されなかったため、こちらで質問させて頂きました。
どのように改善すればいいのか教えて頂きたいです。よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 2つのexeの間で値の受け渡し

#2

投稿記事 by h2so5 » 9年前

AppTitleの型をAnsiStringではなくWideStringに変えてみてください。

ツンドラ

Re: 2つのexeの間で値の受け渡し

#3

投稿記事 by ツンドラ » 9年前

アドバイスありがとうございます。
ご指摘の通り以下のようにソースコードを改変してみました。WideStringにすると.c_str()が使えないようなのでそこも改変しました

コード:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	// 送信したいアプリのタイトルを設定します
	WideString AppTitle = "受信側";

	// アプリのタイトルからウィンドウハンドルを取得します
	HWND hwnd = FindWindow(NULL, AppTitle);

	// LParamに数値を入れてポストメッセージ送信
	PostMessage(hwnd, WM_USER+100, 0, StrToInt(Edit1->Text));

}
エラーは以下の通りです。

コード:

	// アプリのタイトルからウィンドウハンドルを取得します
	HWND hwnd = FindWindow(NULL, AppTitle);
E2034 'WideString' 型は 'const wchar_t *' 型に変換できない
E2342 パラメータ 'lpWindowName' は const wchar_t * 型として定義されているので WideString は渡せない

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 2つのexeの間で値の受け渡し

#4

投稿記事 by みけCAT » 9年前

AppTitleの型をAnsiStringに戻して、FindWindowをFindWindowAに変えるとどうなりますか?(c_str()も戻してください)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ツンドラ

Re: 2つのexeの間で値の受け渡し

#5

投稿記事 by ツンドラ » 9年前

アドバイスありがとうございます。
ご指摘の通りに修正してみたところ、コンパイルが通りました!

そのときのソースコードです。

コード:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	// 送信したいアプリのタイトルを設定します
	AnsiString AppTitle = "受信側";

	// アプリのタイトルからウィンドウハンドルを取得します
	HWND hwnd = FindWindowA(NULL, AppTitle.c_str());

	// LParamに数値を入れてポストメッセージ送信
	PostMessage(hwnd, WM_USER+100, 0, StrToInt(Edit1->Text));
}
ボタンを押してみてもエラーにならないので、正常に動作しているものと思います。
引き続き受信側も実装し、正常に動いているかどうか確かめます。

FindWindowではなく、AnsiString対応のFindWindowAという関数を用いるのですね。思いつきもしませんでした。
こちらのサイトで詳細を知りました。
http://msdn.microsoft.com/en-us/library ... s.85).aspx

アドバイスを下さったh2so5さん、 みけCATさん、ありがとうございました。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 2つのexeの間で値の受け渡し

#6

投稿記事 by h2so5 » 9年前

補足ですがc_str()の代わりにc_bstr()を使えばWideStringとFindWindowの組み合わせでコンパイルできるはずです。

ツンドラ

Re: 2つのexeの間で値の受け渡し

#7

投稿記事 by ツンドラ » 9年前

c_bstr()の方法も試してみたところ、こちらも正常に動作することが確認できました!
以下そのソースコードです。

コード:

void __fastcall TSend::Button1Click(TObject *Sender)
{
	// 送信したいアプリのタイトルを設定します
	WideString AppTitle = "受信側";

	// アプリのタイトルからウィンドウハンドルを取得します
	HWND hwnd = FindWindow(NULL, AppTitle.c_bstr());

	// LParamに数値を入れてポストメッセージ送信
	PostMessage(hwnd, WM_USER+100, 0, StrToInt(Edit1->Text));
}
ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る