DOBON.NET DOBON.NETプログラミング掲示板過去ログ

GlobalAtomを使ってアプリケーション間のデータやり取り

環境/言語:[C# / MQL言語]
分類:[.NET]

GlobalAddAtomとGlobalGetAtomを使ってアプリケーション間で間接的にデータのやり取りを行いたいです。送り側から送った文字列が、受け側では1文字しか読み取れず困っています。

下の受け側のところで、ATOMに書き込んだ文字列の頭1文字しか受け取れません。
どなたかご教示ください。

//↓送り側↓
#include <WinUser32.mqh>
#import "kernel32.dll"
int GlobalAddAtomA(string lpString);
int GlobalGetAtomName(int nAtom, string lpBuffer,int nSize);
int GlobalDeleteAtom(int nAtom);
#import "user32.dll"
int FindWindowW(string sClassName, string sWindowName);
int SendMessageA(int hWnd,int Msg,int wParam,int lParam);
#import
#define WM_APP_ATOM 0x8001

int OnInit()
{
string WindowCaption = "TestForm";
string ClassName = "WindowsForms10.Window.8.app.0.2bf8098_r11_ad1";
int HWND = FindWindowW(ClassName, WindowCaption);

int atom = GlobalAddAtomA("TestString");
SendMessageA(HWND, WM_APP_ATOM, atom, 0);
GlobalDeleteAtom(atom);

return(INIT_SUCCEEDED);
}


//↓受け側(C#)↓
int WM_APP_ATOM = 0x8001;
[DllImport("kernel32.dll", SetLastError = true)]
static extern int GlobalGetAtomName(int nAtom, StringBuilder lpBuffer, int nSize);

protected override void WndProc(ref Message msg) {
if (msg.Msg == WM_APP_ATOM) {
StringBuilder buf = new StringBuilder();
int size = GlobalGetAtomName((int)msg.WParam, buf, 1024);
textBox_receiver.Text = buf.ToString();
//-->ここで"T"しか表示されない(本来は"TestString"を表示したい)
}
base.WndProc(ref msg);
}
私はMQLなるものは知らないのですが、MQLにおけるstringってのは、Win32APIを呼び出すときはUnicode/ANSIは適当によろしくやってくれるものなのでしょうか?
> int GlobalAddAtomA(string lpString);
> int FindWindowW(string sClassName, string sWindowName);
Ansi版、Unicode版に関わらず同じstringを使用していますが。
// あとATOMは16ビットのはずだけどintでいいのかな。

> StringBuilder buf = new StringBuilder();
> int size = GlobalGetAtomName((int)msg.WParam, buf, 1024);
StringBuilderを受け取りバッファとして使用する場合、new StringBuilder(int)を使ってキャパシティを明示します。
// GlobalAddAtomは最大255バイトだそうなので、1024はいらないでしょうけど。

どうせメッセージ送るならWM_COPYDATAの方が融通が利きそうですが、MQLで実現が面倒とかあるんですかね。
Hongliang様

アドバイスありがとうございます。
UnicodeとANSIを全く意識せずに行っていましたが、GlobalAddAtomAをGlobalAddAtomWに変えたことろうまく行きました!
本当に助かりました。
ありがとうございます。
解決済み!
9/29に No32637 の投稿者様から、 No32637 の記事を削除または編集してほしいというメールをいただきました。その日の夜に返信のメールを送らせていただきましたが、お返事をいただけておりませんので、もしかしたら迷惑メールとして扱われてしまったのかもしれないという老婆心からこのメッセージを書かせていただいています。

メールにも書かせていただきましたが、 No32637 の投稿元のIPアドレスと、メールの送信元のIPアドレスが異なっていたため、この記事を投稿したご本人からのご依頼という判断ができませんでした。お手数ですが、 No32637 を投稿した時と同じ方法で、この記事に返信を付けるという形で、 No32637 をどのように修正すればよいか具体的な内容を投稿していただけないでしょうか?

もし私が受け取ったメールが偽物であったり、No32637 を編集する必要がなくなったということでしたら、このメッセージは無視していただいて構いません。

以上です。よろしくお願いいたします。

DOBON.NET | プログラミング道 | プログラミング掲示板