cとc#での共有メモリ

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

cとc#での共有メモリ

#1

投稿記事 by さこさこ » 12年前

http://www.argv.org/~chome/shmem.html
で紹介されている方法で共有メモリを作成して、c#で作ったプログラムでこの共有メモリを読むにはどうすればいいのでしょう。

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: cとc#での共有メモリ

#2

投稿記事 by YuO » 12年前

MemoryMappedFile.OpenExistingで開いて,CreateViewStreamで得たStream相手に入出力,でしょうか。

さこさこ

Re: cとc#での共有メモリ

#3

投稿記事 by さこさこ » 12年前

ありがとうございます。
やってみたんですが変数aaには何も入っていません。
もちろん最初に共有メモリは作って適当な文字をいれてあり「なまえ」の部分もちゃんと指定しています。
何が悪いのでしょうか。

コード:

            MemoryMappedFile MemoryMappedFile = MemoryMappedFile.OpenExisting("なまえ");
            MemoryMappedViewStream stream = MemoryMappedFile.CreateViewStream();
            BinaryReader reader = new BinaryReader(stream);
            string aa = reader.ReadString();

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: cとc#での共有メモリ

#4

投稿記事 by YuO » 12年前

BinaryReader.ReadStringは,先頭に長さを示す可変長のデータが含まれていないと正しく読み取れません。
C++とC#で文字列をやりとりするのであれば,先頭にint型の領域を設けそこにC++側で長さを指定しておき,C#側ではそのバイト数だけ読み取ってEncoding.GetStringで文字列化するとよいでしょう。

さこさこ

Re: cとc#での共有メモリ

#5

投稿記事 by さこさこ » 12年前

>先頭にint型の領域を設け
とはどうやればいいのでしょう。
教えてください。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: cとc#での共有メモリ

#6

投稿記事 by へにっくす » 12年前

さこさこ さんが書きました:>先頭にint型の領域を設け
とはどうやればいいのでしょう。
教えてください。
初めの投稿でリンクされているサンプルを挙げて説明しますと、
以下の部分

コード:

::lstrcpy(shmem, ctime(&clock));
を、
こう書き換えることに相当します(検証してないので間違いがあるかもしれません)

コード:

int iLen = strlen(ctime(&clock));
::memcpy(shmem, &iLen, sizeof(int));
::memcpy(shmem + sizeof(int), ctime(&clock), iLen);
読込の方はC側でsizeof(int)の結果が4であれば、BinaryReader.ReadInt32を使います(4バイト=32ビット)。
written by へにっくす

さこさこ

Re: cとc#での共有メモリ

#7

投稿記事 by さこさこ » 12年前

コード:

            MemoryMappedFile MemoryMappedFile = MemoryMappedFile.OpenExisting("名前");
            MemoryMappedViewStream stream = MemoryMappedFile.CreateViewStream();
            BinaryReader reader = new BinaryReader(stream);
            int asa = reader.ReadInt32();
            string aa = reader.ReadString();
として読み込むのですが「closeclose」と読み込まれなければならないのに「loseclose」になってしまいました。

さこさこ

Re: cとc#での共有メモリ

#8

投稿記事 by さこさこ » 12年前

なぜか1文字少ない状態になってしまいます。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: cとc#での共有メモリ

#9

投稿記事 by へにっくす » 12年前

YuOさんのコメント見ていないのですか。
ReadString使えってどこに書いてありますか。
バイト数だけ読み取って、Encode.GetStringで文字列化するとありますよね?それはReadStringではできませんよ。
ReadInt32が返した値は、文字列の長さ(=バイト数)になってますか。
written by へにっくす

さこさこ

Re: cとc#での共有メモリ

#10

投稿記事 by さこさこ » 12年前

使いましたがエラーがでて自力では解決できませんでした。

コード:

string aa = System.Text.Encoding.UTF8.GetString(reader);

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: cとc#での共有メモリ

#11

投稿記事 by へにっくす » 12年前

意味を理解していないですね。Encoding.GetStringで文字列化すれば、の前に、
バイト数だけ読み取る部分がないですよ。ReadStringメソッドの代わりに何を使えばいいか、
BinaryReaderのヘルプを見てちゃんと実装してください。
オフトピック
C#ちゃんと理解してますか?と疑いたくなるようなレスですね。GetStringの引数はbyte[]なのに何でBinaryReaderクラスの変数であるreaderを入れることができるの?
焦って答えてもいいことはありませんよ。
written by へにっくす

さこさこ

Re: cとc#での共有メモリ

#12

投稿記事 by さこさこ » 12年前

そうなんです。
c#は全く分からないのです。
始めてから、10時間程度と考えてください。
しかも半分以上はフォームのコントロールの配置とかマウスで操作できるところしかやっていません。
プログラムでwbbrowserを使う必要があったのでc#をしょうがなくやっています。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: cとc#での共有メモリ

#13

投稿記事 by へにっくす » 12年前

さこさこ さんが書きました:そうなんです。
c#は全く分からないのです。
始めてから、10時間程度と考えてください。
そういうことは最初に書いてください。
回答する側もそのつもりでレスするようになりますから。

ただ今回は、ヘルプみりゃ分かる、という点で変わらない投稿になったと思いますが。
(だって書込み側は出来てそうだしね)
ReadStringメソッドの代わりに何を使えばいいか、
BinaryReaderのヘルプを見てちゃんと実装してください。
これに対する回答をレスしてください。
written by へにっくす

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: cとc#での共有メモリ

#14

投稿記事 by YuO » 12年前

そもそも,共有メモリを使用する必要はあるのですかね。
普通のプロセス間通信,TCP/IPやNamed Pipeなどに比べて,共有メモリは同期や排他が必要なので格段に取り扱いが難しい技術です。
勉強不足であるならば,もっと簡単な方法を採った方がよいと思いますが。
オフトピック
現実的に共有メモリが必要な状態ってあまり思いつかないです。
他のプロセス間通信では不足するという状態にならないと思うのですが。
さこさこ さんが書きました:プログラムでwbbrowserを使う必要があったのでc#をしょうがなくやっています。
CでIWebBrowser2使えばよいのでは,と思ってしまったり。

閉鎖

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