2016-04-22 36 views
-1

他のプログラム間で変数を共有するために使用されるdata_segを含むDll(C++)があります。それは動作し、多くのプログラムがそれを使用しています(30+)。問題は、このライブラリを新しいプロジェクトに追加したことですが、アクセスしようとする変数は決してその値を変更しません。私はプログラムを再起動する必要があり、今は他のプログラムの残りの部分と同期し、変数の最後の値を見ることができます。どんな手掛かり?Dllと共有変数

ありがとうございます。

+0

Haaaaaaardは、あなたが実際にそのメモリを共有する方法を知らなくても推測する... –

+0

DLL変数は*ありませんライブラリ(ユーザ=プロセス)のユーザ間での共有*ライブラリに依存する各プロセスには独自の変数があります。プログラムを再起動すると、外部情報の値が初期化されるため、 –

+0

各ユーザーだけでなく、各プロセス!しかし、この変数が何らかの種類の共有メモリを指していない場合にのみ正しいです(例:https://msdn.microsoft.com/en-us/library/windows/desktop/aa366878%28v=vs.85%29を参照)。 .aspx)。 – Aconcagua

答えて

1

変数を宣言する方法や変数を変更する方法など、多くの情報は提供しません。変数は唯一のアプリケーションの再起動後に同期されていることを、私はあなたには、いくつかのキャッシュの問題を持っている唯一の疑いがあることができます - あなたの説明から

https://msdn.microsoft.com/en-us/library/h90dkhs0%28v=vs.90%29.aspx?f=255&MSPPError=-2147217396

:私はあなたがMSDNのドキュメントのようにそれを正しく書かれていると仮定します。私はあなたの変数を揮発性にして、アトミックを使用してそれらを変更/読みとることをお勧めします。例えば

:今

#pragma data_seg("Shared") 
volatile LONG g_mydata = 0; 
#pragma data_seg() 

#pragma comment(linker, "/Section:Shared,RWS") 

を修正するg_mydata(1だけインクリメント):

InterlockedExchangeAdd((PLONG)&g_mydata, 1); 
+0

私はこのような変数を作成します:int my_variable = 0、そしてすべての変数はgetter/setterを持っています、これはどのように動作するのですか?なぜ私たちは1000以上の変数が完全にこのように動作しているので、彼らはなぜ動作しないのか分かりません。 – LVB