ページ 1 / 1
cとc#での共有メモリ
Posted: 2013年8月29日(木) 19:08
by さこさこ
http://www.argv.org/~chome/shmem.html
で紹介されている方法で共有メモリを作成して、c#で作ったプログラムでこの共有メモリを読むにはどうすればいいのでしょう。
Re: cとc#での共有メモリ
Posted: 2013年8月29日(木) 23:52
by YuO
Re: cとc#での共有メモリ
Posted: 2013年8月30日(金) 21:05
by さこさこ
ありがとうございます。
やってみたんですが変数aaには何も入っていません。
もちろん最初に共有メモリは作って適当な文字をいれてあり「なまえ」の部分もちゃんと指定しています。
何が悪いのでしょうか。
コード:
MemoryMappedFile MemoryMappedFile = MemoryMappedFile.OpenExisting("なまえ");
MemoryMappedViewStream stream = MemoryMappedFile.CreateViewStream();
BinaryReader reader = new BinaryReader(stream);
string aa = reader.ReadString();
Re: cとc#での共有メモリ
Posted: 2013年8月31日(土) 00:38
by YuO
BinaryReader.ReadStringは,先頭に長さを示す可変長のデータが含まれていないと正しく読み取れません。
C++とC#で文字列をやりとりするのであれば,先頭にint型の領域を設けそこにC++側で長さを指定しておき,C#側ではそのバイト数だけ読み取って
Encoding.GetStringで文字列化するとよいでしょう。
Re: cとc#での共有メモリ
Posted: 2013年8月31日(土) 08:48
by さこさこ
>先頭にint型の領域を設け
とはどうやればいいのでしょう。
教えてください。
Re: cとc#での共有メモリ
Posted: 2013年8月31日(土) 11:07
by へにっくす
さこさこ さんが書きました:>先頭に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ビット)。
Re: cとc#での共有メモリ
Posted: 2013年8月31日(土) 12:16
by さこさこ
コード:
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#での共有メモリ
Posted: 2013年8月31日(土) 13:18
by さこさこ
なぜか1文字少ない状態になってしまいます。
Re: cとc#での共有メモリ
Posted: 2013年8月31日(土) 22:03
by へにっくす
YuOさんのコメント見ていないのですか。
ReadString使えってどこに書いてありますか。
バイト数だけ読み取って、Encode.GetStringで文字列化するとありますよね?それはReadStringではできませんよ。
ReadInt32が返した値は、文字列の長さ(=バイト数)になってますか。
Re: cとc#での共有メモリ
Posted: 2013年8月31日(土) 22:21
by さこさこ
使いましたがエラーがでて自力では解決できませんでした。
コード:
string aa = System.Text.Encoding.UTF8.GetString(reader);
Re: cとc#での共有メモリ
Posted: 2013年8月31日(土) 22:29
by へにっくす
意味を理解していないですね。Encoding.GetStringで文字列化すれば、の前に、
バイト数だけ読み取る部分がないですよ。ReadStringメソッドの代わりに何を使えばいいか、
BinaryReaderの
ヘルプを見てちゃんと実装してください。
オフトピック
C#ちゃんと理解してますか?と疑いたくなるようなレスですね。GetStringの引数はbyte[]なのに何でBinaryReaderクラスの変数であるreaderを入れることができるの?
焦って答えてもいいことはありませんよ。
Re: cとc#での共有メモリ
Posted: 2013年9月01日(日) 07:24
by さこさこ
そうなんです。
c#は全く分からないのです。
始めてから、10時間程度と考えてください。
しかも半分以上はフォームのコントロールの配置とかマウスで操作できるところしかやっていません。
プログラムでwbbrowserを使う必要があったのでc#をしょうがなくやっています。
Re: cとc#での共有メモリ
Posted: 2013年9月01日(日) 08:25
by へにっくす
さこさこ さんが書きました:そうなんです。
c#は全く分からないのです。
始めてから、10時間程度と考えてください。
そういうことは最初に書いてください。
回答する側もそのつもりでレスするようになりますから。
ただ今回は、ヘルプみりゃ分かる、という点で変わらない投稿になったと思いますが。
(だって書込み側は出来てそうだしね)
ReadStringメソッドの代わりに何を使えばいいか、
BinaryReaderのヘルプを見てちゃんと実装してください。
これに対する回答をレスしてください。
Re: cとc#での共有メモリ
Posted: 2013年9月01日(日) 22:37
by YuO
そもそも,共有メモリを使用する必要はあるのですかね。
普通のプロセス間通信,TCP/IPやNamed Pipeなどに比べて,共有メモリは同期や排他が必要なので格段に取り扱いが難しい技術です。
勉強不足であるならば,もっと簡単な方法を採った方がよいと思いますが。
オフトピック
現実的に共有メモリが必要な状態ってあまり思いつかないです。
他のプロセス間通信では不足するという状態にならないと思うのですが。
さこさこ さんが書きました:プログラムでwbbrowserを使う必要があったのでc#をしょうがなくやっています。
Cで
IWebBrowser2使えばよいのでは,と思ってしまったり。