VC++2005にて下記サイトを参考にパイプを用いたプロセス間通信を行うプログラムを作成しています。

猫でもわかるプログラミング
(1)第242章 匿名パイプ(サーバー側)
http://www.kumei.ne.jp/c_lang/sdk3/sdk_242.htm
(2)第243章 匿名パイプ(クライアント側)
http://www.kumei.ne.jp/c_lang/sdk3/sdk_243.htm

サーバー側からWriteFileでデータを送信する際に、
char型配列に入ったバッファデータ「szBuf」を送信し、
クライアント側のReadFileで同じく「szBuf」で受信していますが、
構造体Data
==================
typedef TypeData{
int a;
int b;
char c[10];
}Data;
==================
のオブジェクトdataを送信するには、WriteFile及びReadFileの箇所は
どのように実装すれば良いのでしょうか?
MSDNにはWriteFileの引数の型はLPCVOIDとあるため、
可能だと思うのですが。。。
もし解決策をご存知の方おられましたら、ご教示お願い致します。

「パイプを用いたプロセス間通信について」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>Data* data;


>ReadFile(hRead, (LPVOID)data, sizeof(data), &dwResult, NULL);
構造体の実体はmalloc()等で作ってありますか?
補足のコードのままだとすると、dataの中身はNULL(あるいはゴミ)になっているのでエラーになって当然です。
////////
Data* data;
data = malloc(sizeof(data));
ReadFile(hRead, (LPVOID)data, sizeof(data), &dwResult, NULL);
////////
あるいは、ポインタを使わずに次のようにしてもいいです。
Data data;
ReadFile(hRead, (LPVOID)&data, sizeof(data), &dwResult, NULL);
※WriteFileの方も、dataはポインタではないと思うのですが...
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご教示頂いた内容を参考に、作成し直したいと思います。

お礼日時:2009/05/31 15:53

(LPCVOID)data



(LPCVOID)&data
としてみて下さい。

この回答への補足

ご回答ありがとうございます。
(LPCVOID)data
⇒(LPCVOID)&data
とすることでWrite側はコンパイルが通りました。
しかしRead側で
Data* data;
ReadFile(hRead, (LPVOID)data, sizeof(data), &dwResult, NULL);
とポインタで受け取ろうと思ったのですが、画像の様なエラーが出てしまい、
データを受け取れません。。
聞いてばかりで本当に申し訳ありませんが、Read側でどのような実装で
データを受け取れば良いのか、ご教示お願いできませんでしょうか?

補足日時:2009/05/24 13:24
    • good
    • 0

普通のファイルI/O同様に扱えます。


Dataにキャストすれば問題ないと思います。

この回答への補足

typedef TypeData{
⇒typedef struct TypeData{
ですね。すみません。。
こちらのURLの方が分かりやすかったので、参考にしてキャストしてみました。
http://www2m.biglobe.ne.jp/~yasutaka/intro2/no_1 …

WriteFile(hWrite, szBuf, sizeof(szBuf), &dwResult, NULL)
の箇所を
Data data;
WriteFile(hWrite, (LPCVOID)data, sizeof(data), &dwResult, NULL)
にキャストし、実行しましたが下記エラーが発生しました。
>2 番目の引数を 'Data' から 'LPVOID' に変換できません。
キャストの仕方が悪いのでしょうか?お手数ですが、具体的な解決策についてご教示お願いできませんでしょうか。

補足日時:2009/05/24 00:00
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QをVisualStudioでつかえるようにする

<unistd.h>をVisualStudioでつかえるようにしたいのですが、問題なくコンパイルできるようにするにはどうしたらいいでしょうか?

CygwinというやつをインストールしてやってみたのですがやはりVisualStudioだけでコンパイルしてやりたいのですが。。。。

Aベストアンサー

おそらく<unistd.h>をフルスペックで利用したいわけではないと思います。その中の一部の関数を使いたいだけなら<io.h>などで代用できるはずですから、ヘルプで調べてみることをお勧めします。

ソースを修正せずに、コンパイル&実行ができるようにすることは諦めた方がよいと思います。

移植のことを考えるなら、<unistd.h>とか<windows.h>のような環境に特化したヘッダや、そこで宣言される型や関数などを直接使うのではなく、適切にラッピングしてから使う方が後々楽です。今回は仕方ないでしょうが、今後はそうしましょう。

QC言語の型による処理速度の違い

short int型よりint型。float型よりdouble型の方が
扱えるサイズは広いにも関わらず処理速度が速いと
聞いたのですが、それは本当でしょうか?
もしそうならなぜそうなるのでしょう?
(一度BCCでfloatとdoubleの処理速度を計ったらfloatの
方が少し早かったですが・・)


高速なプログラムを書く必要の出たときのために型に
よる処理速度を教えてください。

Aベストアンサー

> 高速なプログラムを書く必要の出たときのために型に
> よる処理速度を教えてください。

処理系に依存しますし、処理系のマニュアルにも記載されていない場合が多いので、自分でコンパイル結果を見ながら確認する必要があります。
組み込み用の処理系では、マニュアルにこの辺りの解説が書かれているものをよく見かけます。

一般的には、short型がint型より小さい場合は、何らかの演算の前には汎整数拡張によってint型に暗黙の型変換が起こりますので、その分だけ遅くなる場合があります。ただし、プロセッサのアーキテクチャによっては、こうしたオーバーヘッドが発生しないものも普通に存在します。

浮動小数点型の場合ですが、標準化以前のC言語では、float型はいったんdouble型に暗黙の型変換が行われてから演算していたのですが、標準Cではfloat型はfloat型のまま演算してもよいことになり、多くの処理系はそのようになっています。
また、可変個実引数や、関数原型のない関数の引数としてfloat型の値を渡した場合、既定の実引数拡張によってdouble型に暗黙の型変換が起こります。

いずれにしても、暗黙の型変換が発生し、それにコストがかかるような処理系では、クリティカルな処理では大きな影響が出ることが十分考えられます。

> 高速なプログラムを書く必要の出たときのために型に
> よる処理速度を教えてください。

処理系に依存しますし、処理系のマニュアルにも記載されていない場合が多いので、自分でコンパイル結果を見ながら確認する必要があります。
組み込み用の処理系では、マニュアルにこの辺りの解説が書かれているものをよく見かけます。

一般的には、short型がint型より小さい場合は、何らかの演算の前には汎整数拡張によってint型に暗黙の型変換が起こりますので、その分だけ遅くなる場合があります。ただし、プロセ...続きを読む

QLPCWSTRとchar

質問なのです・・・

現在、私は[Visual Stdio.Net 2005]を使って、C++のプログラミングをしようと思いまして、今日参考書を見てやってみたのですが、

charの配列を使って、文字列を格納しそれを使おうとしたら、LPCWSTRのキャストが必要というエラーがでました。
参考書だと普通に通るらしいのですが・・・Visual Stdio.Net 2003と2005の違いなのでしょか?わかる方教えていただけませんでしょうか??

Aベストアンサー

補足です。
2005デフォルトのUNICODEを変更する方法は
プロジェクト->プロパティ->構成プロパティ->全般 の中にある
文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]
に変更することで可能です。

QVC++から引数付きexeファイルの実行

タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか?
exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。
出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。
開発環境はVisualStudio2005です。

Aベストアンサー

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
printf("ARGV[%d]=%s\n",i,argv[i]);
}
return 0;
}
以下、実行結果です。
コマンドプロンプト画面に下記の文字が出力されます。
------------------------
system試験開始
ARGV[0]=C:\VCSTUDY\printarg\Debug\printarg.exe
ARGV[1]=XXX
ARGV[2]=YYY
ARGV[3]=ZZZ
system成功
Press any key to continue
---------------------------

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
p...続きを読む

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。

Qプロセス間通信方法について

複数のマシン(Solaris8)からの情報を1台のマシン(Solaris8)で収集する
プログラムを作成したいのですが、rshではセキュリティの関係上使用出来ません。
そこでプロセス間通信を利用したいと考えております。
まず、複数のマシン上に情報収集用のプログラムを置いておき、1台のマシンから
パラレルにキックをかけて情報収集が出来ないものかお教え下さい。
名前は知っているのですが、方法がわかりません。
この様にすれば可能ですよとか、事例紹介ページ、規正の製品が有ればお教え下
さい。

よろしくお願い致します。

Aベストアンサー

あなたが知りたい内容はだいたい分かった気がします。

悪いことは言いませんから、まずは、測定プログラムを CGI として実装することを
薦めます。

馬鹿みたいに大きなプログラムじゃない限り、ディスクからのロードなんてたいした
オーバヘッドにはなりません。

まずは、CGI として実装してみて、それでも速度に不満があるようであれば、そこで
はじめて、そのCGI を、情報収集デーモンにすれば良いでしょう。


後々、プログラムを分離することを念頭において CGI をつくるなら、情報の収集と、
それの出力を別関数として実装しておくことが大事です。

CGI の main() がこんな感じになるように。

int main()
{
  収集内容 data;

  data = 情報収集関数(必要な引数);

  情報の出力(data, その他必要な引数);

  return 0;
}

後で、情報収集関数を別プロセスに移すときには、この関数がそのまま使えますし、
この部分がプロセス間通信になるだけですから。


★別プロセスに情報収集を分離したときの CGI

int main()
{
  収集内容 data;

  収集プロセスの起動取得(必要な引数);
  data = 収集を待って情報を取得関数(必要な引数);

  情報の出力(data, その他必要な引数);

  return 0;
}

★情報収集プロセスの main()

int main()
{
  デーモンになるための作法が幾つか…

  while(起動の待合わせ) {
    pid_t pid;
    if ((pid = fork()) == 0) {
      収集内容 data;
      data = 情報収集関数(必要な引数);
      CGIへ収集情報を送信関数(data);
      return 0;
    }
  }

  return 0;
}

という感じになります。

データの待ち合わせをして、ある程度の情報をやり取りする場合のプロセス間通信には
メッセージキューが向いてます。msgget(), msgsnd(), msgrcv() といったシステム
コールを使います。


> 基礎が全くわかっておりません。簡単な例で結構ですのでお教え下さい。
> 本来であれば、この程度の人間がご質問すること自体間違っていることは
> 承知しております。

ここは、分からない人が質問するサイトですから、質問すること自体は間違ってない
んですが、それなりに書くことがあるので、「簡単な例」といわれても書くのが
面倒なんです (^^;

あなたが知りたい内容はだいたい分かった気がします。

悪いことは言いませんから、まずは、測定プログラムを CGI として実装することを
薦めます。

馬鹿みたいに大きなプログラムじゃない限り、ディスクからのロードなんてたいした
オーバヘッドにはなりません。

まずは、CGI として実装してみて、それでも速度に不満があるようであれば、そこで
はじめて、そのCGI を、情報収集デーモンにすれば良いでしょう。


後々、プログラムを分離することを念頭において CGI をつくるなら、情報の収集と、
...続きを読む

QCreateProcessでの実行ファイルの操作について

VC++ 6.0 Win98

カレントディレクトリに実行ファイルをいれておいて、szCommand[]="eee"とすると(eeeは実行ファイルです。)実行してくれるのですが、相対パスや絶対パスを使うと実行をしてくれません。
CreateProcessでは、相対パスや絶対パスは使えないのでしょうか?
ちなみにコマンドラインから直接(相対パスや絶対パスを使用して)に打つと実行ファイルが動作します。

あと、リダイレクトも使えないのでしょうか?(動作しなかったので・・)

STARTUPINFO si;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_USESTDHANDLES;
si.hStdOutput=hFile;
si.hStdError=hFile;
char szCommand[]= "C:\\\"My Documents\"\\nannka\\VC++\\Ten3\\eee";

PROCESS_INFORMATION pi;
CreateProcess(
NULL,
szCommand,//コマンド
//NULL,
NULL,NULL,
TRUE, 0,
NULL,NULL,
&si,&pi
);


よろしくお願いします。

VC++ 6.0 Win98

カレントディレクトリに実行ファイルをいれておいて、szCommand[]="eee"とすると(eeeは実行ファイルです。)実行してくれるのですが、相対パスや絶対パスを使うと実行をしてくれません。
CreateProcessでは、相対パスや絶対パスは使えないのでしょうか?
ちなみにコマンドラインから直接(相対パスや絶対パスを使用して)に打つと実行ファイルが動作します。

あと、リダイレクトも使えないのでしょうか?(動作しなかったので・・)

STARTUPINFO si;
ZeroMemory(&si,sizeof(STARTUPINFO));
...続きを読む

Aベストアンサー

> もし、お時間がありましたら部分的に囲み方法ではダメなのか教えてもらえないでしょうか?

「*何故* ダメなのか?」ってこと?

想像でしかないですが、解釈する人が違うから、としか言いようが無いですね。

コマンドラインからの場合は、cmd.exe (もしくは Shell) が解釈している。CreateProcess の場合には違う人が解釈している、と。

QCloseHandle()

スレッドを、同じハンドルを利用して作る場合、
途中でハンドルの開放が必要か教えてください。


void thread1();
HANDLE handle;

//スレッド作成
handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread1, NULL, 0, &dwID);
//作ったスレッドの終了を待つ
WaitForMultipleObjects(1, handle, TRUE, INFINITE);
//スレッドを作った時のハンドルを閉じる。これ必要?
CloseHandle(handle);
//同じハンドルを利用して別のスレッドであるthread2を作成
handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread2, NULL, 0, &dwID);


この、CloseHandle(handle);は必要ですか?

Aベストアンサー

ハンドルは、Windowsがリソースを管理するために付ける数値です。
質問中で、
HANDLE handle;
として、ハンドル型の変数を定義していますが、この「handle」自体はハンドルではなく、CreateThread()からの戻り値がハンドルです。

一度、
handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread1, NULL, 0, &dwID);
を実行した後、
handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread2, NULL, 0, &dwID);
としても、同じハンドル変数を使用していますが、同じハンドルを使用しているわけではありません。
1度目のCreateThread()も、2回目のCreateThread()も新たにWindowsから取得したハンドルを返すからです。

ハンドルは、使用後、閉じる必要がありますので、
CloseHandle(handle);
は必要です。

ハンドルは、Windowsがリソースを管理するために付ける数値です。
質問中で、
HANDLE handle;
として、ハンドル型の変数を定義していますが、この「handle」自体はハンドルではなく、CreateThread()からの戻り値がハンドルです。

一度、
handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread1, NULL, 0, &dwID);
を実行した後、
handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread2, NULL, 0, &dwID);
としても、同じハンドル変数を使用していますが、同じハンドルを使用し...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報