VC++メッセージの送受信について教えてください。
VC++でソフトを作成しています。
初心者なのでわからないことだらけです。
どなたかご教授お願いします。
■環境
Windows xp mode
Visual Studio 2010 Professional
VC++
フォームアプリケーション
.net Framework4.0
■相談内容
アプリ1のtextBoxに入力された文字列をアプリ2に送信して、アプリ2のtextBoxに表示させたいのですが、PostMessageを使用するとメッセージが送れません。
また、SendMessageを使用すると送れますが、共有メモリを使用すると文字列が途中で途切れてしまいます。
PostMessageと共有メモリの使用は指令なのではずせません。
理由は送信側のアプリがロックされるのを防ぐため、後に多数のアプリから送信した文字列を取得できるようにするためです。
下記にソースコードを記載しますので、どこが悪いのか、何が原因でそうなるのか、どうすれば正常に動作するようにできるのかを教えてください。
特に、ソースについてはどこをどのように直せば良いかを教えていただけるとありがたいです。
~送信側ソース~
#pragma once
#include<windows.h>
#include<iostream>
#include<fstream>
#include<string>
#include<msclr/marshal.h>
#pragma comment(lib,"user32.lib")
int s;
using namespace std;
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Runtime::InteropServices;
using namespace msclr::interop;
[DllImport("user32.dll") ]
extern System::String^ FindWindow(String^ lpClassName, String^ lpWindowName);
[DllImport("user32.dll")]
extern System::String^ PostMessage(HWND hWnd, int Msg, int wParam, int lParam);
public: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
System::String^ moji_textBox4;
moji_textBox4=textBox4->Text;
s=textBox4->Text->Length+1;
COPYDATASTRUCT cd;
HWND hWnd;
char buffer[500];
sprintf_s(&buffer[0],5,"%s",moji_textBox4);
cd.dwData=0;
cd.cbData=s;//strlen(buffer)+1;
cd.lpData=buffer;
hWnd=::FindWindow(nullptr,L"アプリ2");
::PostMessage((HWND)hWnd,WM_COPYDATA,0,(LPARAM)&cd);
~受信側ソース~
#pragma once
#pragma comment(lib,"user32.lib")
#include<ctype.h>
#include<windows.h>
#include<msclr/marshal.h>
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Runtime::InteropServices;
using namespace msclr::interop;
public: virtual void WndProc(System::Windows::Forms::Message% msg) override
{
if(msg.Msg== WM_COPYDATA)
{
COPYDATASTRUCT *cd;
cd=(COPYDATASTRUCT *)msg.LParam.ToInt32();
System::String^ str;
str=gcnew System::String((char *)cd->lpData);
pin_ptr<const wchar_t>pstr=PtrToStringChars(str);
System::String^ ShareMemoryName1=L"Information";
HANDLE hmap;
char *pmap;
marshal_context^ context= gcnew marshal_context;
LPCTSTR ShareMemoryName2 = context->marshal_as<LPCTSTR>(ShareMemoryName1);
hmap=::CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,2048,
(LPCTSTR)ShareMemoryName2);
pmap=(char *)::MapViewOfFile(hmap,FILE_MAP_ALL_ACCESS,0,0,1024);
System::String^ pstr1= gcnew System::String(pstr);
ZeroMemory(pmap,2048);
memcpy_s(pmap,2048,pstr,sizeof(pstr));
System::String^ str1;
str1= gcnew System::String((char *)pmap);
textBox6->Text=str1;
UnmapViewOfFile(pmap);
CloseHandle(hmap);
}
Form::WndProc(msg);
}
お礼
回答頂きありがとうございます!! gcnewってこういう風に使うんですね。