お世話になっております。
VC2005にてMFC DLLを作成しています。
プロセスA、プロセスBにてDLLの関数を呼び出しときに
プロセスBではDLLの関数からデータを参照できないのですが
何か対処方法をお教え頂けないでしょうか。
A.EXE(プロセスA:Unicode)
DLL関数:bool ShareMemCreate(int currenAplino, bool dataSave, char *bufName, int nSize)
を呼び出しmemData[4]に各データを設定する。
DLL関数:bool ShareMemRead(char *bufP, int readApliNo, bool dataSave, int nSize)
を呼び出しShareMemCreateで設定したmemData[4]を参照できる。
プロセスAではmemData[4]の設定&参照はできます。
B.EXE(プロセスB:MBCS)
DLL関数:ShareMemWrite(char *bufP, int writeApliNo, bool dataSave, int nSize)
を呼び出しShareMemCreateで設定したmemData[4]の各データが参照できない。
プロセスBではShareMemCreateで設定したデータを参照できない。
但し、プロセスBでDLL関数:bool ShareMemCreateを呼ぶとShareMemWriteで
ShareMemCreateで設定したデータを参照できます。
C.DLL(MFC DLL:MBCS)
各データはpublicです。
struct MemoryMgrData{
int bufName;
int currentApliNo;
bool dataSave;
HANDLE m_hMapping;
LPVOID m_pMappingView;
CMutex *m_pMutex;
LPWSTR shareBufP;
} memData[4];
_DLL_EXPORT bool ShareMemCreate(int currenAplino, bool dataSave, char *bufName, int nSize)
_DLL_EXPORT bool ShareMemRead(char *bufP, int readApliNo, bool dataSave, int nSize)
_DLL_EXPORT bool ShareMemWrite(char *bufP, int writeApliNo, bool dataSave, int nSize)
同一 DLL を複数 EXE がロードしても DLL のデータ領域は共有されないので
当たり前の動作というか仕様どおりというか・・・
その memData をきっちり共有するように作らなきゃ意味が無い。
HANDLE や Mutex などを共有することは原理的に意味が無いので、
・何をどう共有することができるのか
・共有して意味のあるデータって何か
はまじめに検討したうえで設計やり直し、だろうね・・・
DLL側のデータセグメントを共有する方法はあります。
ちゃんとMSDNのヘルプ探せば載ってますが・・・
MFCなんで、エラーなくコンパイルできるかは未確認
C側は・・・
#pragma data_seg("HOGEHOGE_DATA")
// 共有したい変数の宣言
#pragma data_seg()
DEFファイルに下記を設定
SECTIONS
HOGEHOGE_DATA READ WRITE SHARED
※ C++ではやっているんですが、MFCでは使ったこと
ありません。
● すなおに共有メモリ宣言を行ってやってみれば?
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_FileMapping.html
以上。参考まで
お世話になっております。
色々有難う御座いました。
共有メモリでトライしてみます。
お世話になっております。
色々有難う御座いました。
共有メモリでトライしてみます。