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

解決


かかし  2010-11-23 03:01:44  No: 72076

お世話になっております。
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-23 05:05:52  No: 72077

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

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


オショウ  2010-11-23 05:11:53  No: 72078

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-24 04:02:10  No: 72079

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

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


かかし  2010-11-24 04:02:19  No: 72080

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加