DLL内のデータ参照について

解決


かかし  2010-11-22 18:01:44  No: 72076  IP: [192.*.*.*]

お世話になっております。
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)

編集 削除
tetrapod  2010-11-22 20:05:52  No: 72077  IP: [192.*.*.*]

同一 DLL を複数 EXE がロードしても DLL のデータ領域は共有されないので
当たり前の動作というか仕様どおりというか・・・

その memData をきっちり共有するように作らなきゃ意味が無い。
HANDLE や Mutex などを共有することは原理的に意味が無いので、
・何をどう共有することができるのか
・共有して意味のあるデータって何か
はまじめに検討したうえで設計やり直し、だろうね・・・

編集 削除
オショウ  2010-11-22 20:11:53  No: 72078  IP: [192.*.*.*]

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

以上。参考まで

編集 削除
かかし  2010-11-23 19:02:10  No: 72079  IP: [192.*.*.*]

お世話になっております。

色々有難う御座いました。
共有メモリでトライしてみます。

編集 削除
かかし  2010-11-23 19:02:19  No: 72080  IP: [192.*.*.*]

お世話になっております。

色々有難う御座いました。
共有メモリでトライしてみます。

編集 削除