
こんにちわ。
外国為替取引の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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java java final 1 2022/06/10 22:49
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- オープンソース Try Kotlinで readLine()を使うには 1 2023/03/27 21:06
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
【JAVA】与えられた金額を貨幣...
-
連続する「\\」をひとつの「\\...
-
VB.Net Object型 空かどうか
-
VBA Evaluate関数 型が一致しま...
-
VC++におけるCStringの変換
-
ブックマークレットについて
-
サーブレットからIMGタグへ画像...
-
アサーションと例外処理の違い...
-
Timestamp型への変換について(J...
-
例外ってIf文の中に入れますか...
-
時間の取得
-
レコード件数の表示
-
変数名の付け方
-
private static という変数の修飾
-
エクセルVBAで、条件に一致する...
-
生成したインスタンスを削除す...
-
複数の変数を宣言する時、同時...
-
C#において、同じインスタンス...
-
UMLのクラス図はmain()も含むん...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VB.Net Object型 空かどうか
-
数字か文字列かを判定する関数
-
VBA Evaluate関数 型が一致しま...
-
【JAVA】与えられた金額を貨幣...
-
VC++におけるCStringの変換
-
連続する「\\」をひとつの「\\...
-
文字列からダブルクオートの削除
-
C#の捕捉されない例外処理の対...
-
ファイルダイアログを開いた時...
-
C# マルチスレッドにおける例外...
-
0除算の例外処理ができない!!...
-
時間の取得
-
Timestamp型への変換について(J...
-
例外ってIf文の中に入れますか...
-
Excelでのエラー
-
文字列が数字のみで構成されて...
-
VB.NETで16進数が正しいかどう...
-
String型の日付(2005/11/25)の...
-
VBA 400エラー 1004エラー
おすすめ情報