
こんにちわ。
外国為替取引のFXに利用するプログラムを作成しています。
その中で、
C#のプログラムAと
MQLという言語によるプログラムBにおいて、
共有メモリ読み書きを行うDLLを利用して、
(1)Aの結果を共有メモリに書き込み→Bで受け取って処理。
(2)Bの結果を共有メモリに書き込み→Aで受け取って処理。
という仕組みを作成しています。
(2)はできたのですが、(1)がうまくいきません。
知見をお持ちの方アドバイスいただけませんでしょうか。
以下詳細でございます。
●相談内容
共有メモリ書き込み時に以下エラーが発生し、書き込みができない。
「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」
●ソース(一部抜粋。InitializeとRunは基盤システムからコールされます。)
【C#ソース】
using System.Runtime.InteropServices;
using System;
[DllImport("MemMap.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern string SetMemString(string tag, string msg);
public bool Initialize()
{
try{
Console.Write("try01");
SetMemString("TEST", "1");
Console.Write("try02");
SetMemMethod();
}catch(Exception e){
Console.Write(e.Message);
Console.Write(e.StackTrace);
}
return true;
}
public void SetMemMethod(){
SetMemString("TEST", "2");
}
public void Run(){
try{
Console.Write("try03");
SetMemString("TEST", "3");
}catch(Exception e){
Console.Write(e.Message);
Console.Write(e.StackTrace);
}
}
}
}
【コンソール】
try01
保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
場所 test.Main.SetMemString(String tag, String msg)
場所 test.Main.Initialize()
try03
保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
場所 test.Main.SetMemString(String tag, String msg)
場所 test.Main.Run(
【DLL】
MT4_EXPFUNC const char* __stdcall SetMemString(char *tag,char *msg)
{
/*static*/ string ret = "";
bool create = false;
HANDLE hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, tag);
if (!hMap) {
hMap= CreateFileMapping((HANDLE)0xFFFFFFFF , NULL ,
PAGE_READWRITE , 0 , 1024 , tag);
q.push(hMap);
create = true;
}
LPSTR strAllCmd =(LPSTR)MapViewOfFile(hMap , FILE_MAP_WRITE , 0 , 0 , 0);
lstrcpy(strAllCmd , msg);
FlushViewOfFile(strAllCmd,0);
UnmapViewOfFile(strAllCmd);
if(!create) CloseHandle(hMap);
return(ret.c_str());
}
●詳細
try01直後の初期化メソッド(Initialize)で直接コールするSetMemStringは問題なく出来ており、プログラムB側で読むことができていますが、
try02直後の初期化メソッド(Initialize)でコールするメソッドの中のSetMemStringと
try03直後のメイン処理(Run)の中のSetMemString
でエラーが発生します。
try02はソースの綺麗さを保つために別メソッドに切り出したいだけなので、
最悪初期化メソッドに直書きすればよいですが、
メイン処理なので、try03でエラーが発生するのはなんとしても解決したいです。
try01で呼べていることからDllImportのスコープがうまくできていないのでは?
と考えています。
継承元のExpertクラスはソースが隠蔽されていて、わかりませんが、
何かアドバイスいただけませんでしょうか。よろしくお願いします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
呼び出し流れが良くわかりませんが、SetMemString を繰り返すならば 少なくとも UnmapViewOfFile は1度に
しておいた方が良いと思いますが...この回答への補足
アドバイスありがとうございます。
DLLはネットにあったものを拾ってきただけなので、詳しくわからないのですが、
DLLの
>>UnmapViewOfFile(strAllCmd);
という行を削除し、
初期化時点でUnmapViewOfFile を1回だけ呼ぶ方がよいということでしょうか。
そうすることで、エラーは解消されそうですか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VB.Net Object型 空かどうか
-
VBA Evaluate関数 型が一致しま...
-
VB.NETで16進数が正しいかどう...
-
VBA 400エラー 1004エラー
-
C#の捕捉されない例外処理の対...
-
C# マルチスレッドにおける例外...
-
Javaで文字列をゼロ埋め(ゼロパ...
-
コンストラクタでの例外は不可...
-
Timestamp型への変換について(J...
-
【JAVA】与えられた金額を貨幣...
-
変数名の付け方
-
private static という変数の修飾
-
エクセルVBAで、条件に一致する...
-
レコード件数の表示
-
「インスタンス」の意味をわか...
-
【Java】入力した西暦→和暦に変...
-
複数の変数を宣言する時、同時...
-
VB.NET getとsetの概念がわかり...
-
Excelで =EMBED("Acrobat Docu...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
【JAVA】与えられた金額を貨幣...
-
VB.Net Object型 空かどうか
-
時間の取得
-
VBA Evaluate関数 型が一致しま...
-
連続する「\\」をひとつの「\\...
-
C#の捕捉されない例外処理の対...
-
Excelでのエラー
-
ファイルダイアログを開いた時...
-
Timestamp型への変換について(J...
-
C# マルチスレッドにおける例外...
-
nullで、return出来るのはどん...
-
例外ってIf文の中に入れますか...
-
if文が通りません。。。
-
ブックマークレットについて
-
Javaで文字列をゼロ埋め(ゼロパ...
-
数字か文字列かを判定する関数
-
VC++におけるCStringの変換
-
JSPからのパラメータチェック
-
C# の例外処理について
おすすめ情報