2013-08-12 1 views
3

정보는 DLL 데이터 세그먼트

에 벡터를 저장 다음과 같은 경고 : 나는 C에서 동적 링크 라이브러리 ++의 데이터 세그먼트에 벡터를 저장하려고 할 때마다 LINK : warning LNK4039: section '.SHARED' specified with /SECTION option does not exist

항상 발생합니다. 예를 들어

: 나는 간단한 변수를 저장하려고하면

#include <vector> 

struct Obj { 
    unsigned int A; 
    unsigned int B; 
    bool C; 
    std::vector< unsigned char > D; 
}; 

#pragma data_seg(".SHARED") 
std::vector<Obj> Objects; 
#pragma data_seg() 

#pragma comment (linker,"/section:.SHARED,RWS") 

그러나, 컴파일시에는 경고가 없을 것입니다. 이처럼 :

내가하지 절대적으로 긍정적이지만, 내가 경고가 벡터를 초기화하지 않음으로써 발생되었다고 판단하고
#pragma data_seg (".SHARED") 
int SimpleVariable = 0; 
#pragma data_seg() 

? 그렇다면 어떻게 데이터 세그먼트에 저장 될 벡터를 초기화 할 수 있습니까?

다른 질문이 있는데, 이는 DLL 내의 데이터 세그먼트에 벡터를 저장하는 끔찍한 생각입니까?

내가 여러 프로세스에로드 될 DLL 내에서 벡터의 내용을 공유하려고

내 목표.

이 같이

:

process_1.exe 
    - example.dll -| * access the same vector (SomeVector) as 
        |  example.dll within process_2 
        | 
       std::vector SomeVector; // vector in example.dll 
        | 
process_2.exe  | * access the same vector (SomeVector) as 
        |  example.dll within process_1 
    - example.dll -|  
+0

아마 그 data_segement에 복합 유형을 저장할 수 없기 때문일 수 있습니다. –

+0

흠, 맞다면 여러 프로세스에로드되는 동일한 DLL간에 복잡한 유형을 공유하는 다른 방법이 있습니까? –

+2

링커가 * 정적으로 * 초기화 된 데이터를 .bss 대신 데이터 세그먼트에 배치 할 것이라고 저는 믿습니다. 공유 메모리 블록을 만든 다음 new를 사용하여 벡터를 배치 할 수 있습니다. 또한 공유 메모리에 관련 데이터를 할당 한 사용자 정의 할당자가 필요합니다. –

답변

0

http://msdn.microsoft.com/en-us/library/h90dkhs0(v=vs.90).aspx

을하는 방법과 표준 : : 벡터 <은> 초기화?

예 공유 데이터 세그먼트를 사용하는 것은 끔찍한 생각입니다.

실행중인 코드가 해당 프로그램의 프로세스 공간 내에 있으므로 프로세스 주소 공간에서 벡터에 대한 메모리를 할당하도록 기본값으로 설정하려고합니다. 다른 프로세스가 읽거나 쓰려고하는 예외를 throw합니다.

시스템 공유 메모리에서 가져 오는 _alloc을 직접 작성할 수는 있지만 초기화 문제는 해결되지 않습니다.

ipc에 권장되는 방법은 메모리 매핑 파일과 뮤텍스를 사용하는 것입니다.

원하는대로 작동 시키려면 많은 양의 코드가 필요합니다. Std : Vector 코드를 통해 템플릿을 파생시킬 수있을 때까지 편안하게 길을 찾거나 더 빠른 경로를 선택하고 처음부터 직접 작성할 수 있습니다.