現在、VC++でアプリケーションを作っています。
超初心者なのでわからない事だらけです。
どなたかご教授お願いします。
<質問内容>
sendmessageで送信した文字列をtextboxに表示したら文字化けします。
原因がわからないので、もし何か気づかれた方がおられましたら教えてください。
特にどのように変更すれば良いかご指摘いただけると本当に助かります。
<開発環境>
Windows XPモード
Visual Studio 2010 professional
Visual C++
windows フォームアプリケーション
<アプリ動作>
2つのアプリケーションを使用し、片方のアプリから文字列を送り、もう片方のアプリで受信します。
また、受け取った側のアプリケーションは受け取った文字列をtextboxに表示します。
送信側はsendmessage関数で文字列を送信し、受信側はwndproc関数と、共有メモリを使用して受信と表示を行っています。
下記がソースです。
~送信側ソース~
#pragma once
#include<windows.h>
#include<iostream>
#include<fstream>
#include<string>
#pragma comment(lib,"user32.lib")
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;
[DllImport("user32.dll") ]
extern System::String^ FindWindow(String^ lpClassName, String^ lpWindowName);
[DllImport("user32.dll")]
extern System::String^ SendMessage(HWND hWnd, int Msg, int wParam, int lParam);
public: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
COPYDATASTRUCT cd;
HWND hWnd;
char buffer[500];
strcpy_s(buffer,"失敗しました。");
cd.dwData=0;
cd.cbData=strlen(buffer)+1;
cd.lpData=buffer;
hWnd=::FindWindow(nullptr,L"ソフト");
::SendMessage((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((wchar_t*)cd->lpData);
pin_ptr<const wchar_t>pstr=PtrToStringChars(str);
System::String^ ShareMemoryName1=L"LotInformation";
HANDLE hmap;
LPVOID pmap;
marshal_context^ context= gcnew marshal_context;
LPCTSTR ShareMemoryName2 = context->marshal_as<LPCTSTR>(ShareMemoryName1);
hmap=OpenFileMapping(FILE_MAP_WRITE,FALSE,ShareMemoryName2);
if(hmap==NULL)
{
hmap=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,(DWORD)0,(DWORD)2048,(LPCTSTR)ShareMemoryName2);
if(hmap!=NULL)
{
pmap=MapViewOfFile(hmap,FILE_MAP_WRITE,0,0,0);
hmap=OpenFileMapping(FILE_MAP_WRITE,FALSE,ShareMemoryName2);
if(pmap!=NULL)
{
ZeroMemory(pmap,2048);
}
}
}
else
{
pmap=MapViewOfFileEx(hmap,FILE_MAP_WRITE,0,0,0,NULL);
}
ZeroMemory(pmap,2048);
memcpy_s(pmap,2048,pstr,sizeof(pstr));
System::String^ str1;
str1= gcnew System::String((const wchar_t *)pmap);
textBox5->Text=str1;
UnmapViewOfFile(pmap);
CloseHandle(hmap);
}
Form::WndProc(msg);
}
No.1ベストアンサー
- 回答日時:
送信側がマルチバイト文字列(char*)を渡しているのに、受信側がワイド文字列のポインタ(wchar_t*)として受けているためです。
送信側と受信側で一致させる必要があります。…で、それを一致させれば、受信側の最初の str で文字列を取れているはずですが(プロセス間通信に必要な共有メモリでのやり取りは WM_COPYDATA メッセージがすべて代行してくれるので、他にやることは何もない)、それ以降に記載されているマッピングオブジェクトの作成云々は、ここでの送信側でも受信側でもない第三のプログラムが見るために共有メモリに格納しているということでしょうか?
少なくとも、ここの送信側と受信側のやり取りには全く意味のないものですが。
->fresh_homepieさん
回答ありがとうございます。
無事文字列が表示されました。
共有メモリを使用しているのは、おっしゃるとおり第三のプログラムが介入するためです。
ただし、これは前任者からの指示でやっているので自分はよくわかっていません。
初心者ですし、全部はすぐに理解できませんので。
また、今のプログラムはメッセージのやり取りを確認するために固定文字列の送受信を試しているプログラムですので、今後は複数のアプリケーションから変動型の文字列をメッセージとして送受信します。
外部からの変動型文字列をメッセージで送受信するためにも共有メモリを使用しているのだと思います。
本当にありがとうございました。
またわからないことがあれば質問させていただきますのでよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- UNIX・Linux AWSのEC2のZabbixユーザーでawscliコマンドが実行できない状態を解決する 1 2022/12/06 22:17
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 英語 『G19 Gen5 MOS - Modular Optic System for Gen5』 の 『 1 2023/03/05 13:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
だれがとけるの?
-
バッチファイルで以下のような...
-
Linux Cプログラミングを学ぶた...
-
C言語 列挙型(enum型)変数について
-
質問失礼します。 プログラム言...
-
C言語関数違いについて。
-
Windows formアプリで データグ...
-
gccを行ってもexeファイルが生...
-
VisualStudioで、コードを印刷...
-
これなにがちがうんですか??
-
C言語 配列と関数の練習問題
-
こんなことてしますか??
-
Linuxでの開発環境構築や設定の...
-
MACで動く実行ファイルをWindow...
-
win10で、正確な待ち時間の作り方
-
S-JIS → JIS コード変換するには
-
double型が正常に認識されてい...
-
LinuxカーネルのCFSで用いられ...
-
VisualStudio2022でC言語プログ...
-
応用情報技術者試験の令和元年...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
シリアル通信時のデータ受信方法
-
TCP/IP のパケットの分断と結合...
-
UDP受信時の通信異常検知について
-
Outlookの「受信日時」「送信者...
-
RS232cを用いた送信プログラム
-
DHCPOFFERの受信について
-
CRC-CCITTに関しての仕様とサン...
-
recv関数の戻り値について
-
Excxel vba でYahoo API で住所...
-
VC++ 2010 メッセージが文字化...
-
遅延確認応答について教えてく...
-
「TCPは全二重可能」の意味
-
VB2010で、シリアル通信の方法...
-
ネットワークでの受信バイト数
-
TCPでパケットロス?
-
C#にてCTI。RS232Cの受信と送信...
-
赤外線センサーについて
-
PC98で232c送信winndowで受信で...
-
パケット受信 recvfrom( )につ...
おすすめ情報