typedef struct DataBaset
{
DataBaset();
unsigned char* ucNumber;
unsigned char* ucName;
unsigned char* ucAdress;
unsigned char* ucTelephone;
unsigned char* ucCodeERDPOU;
unsigned char* ucIPN;
unsigned char* ucNSpRPPnDV;
unsigned char* ucNumberRR;
} DATABASET, *LPDATABASET;
static FILE* hFile=NULL;
static HANDLE hMapFile=NULL;
static HANDLE hMapOpen=NULL;
static LPDATABASET pDataBaset=NULL;
static LPDATABASET pDataCreateMapping=NULL;
static LPDATABASET pDataOpenMapping =NULL;
static __int64 ulSizeFile=0;
static unsigned long ulReadCountChar=0;
static unsigned long ulStatusConectDLL=0;
static unsigned int uiSizeStruct=0;
DataBaset::DataBaset()
{
ucNumber =new unsigned char[SIZE_NUMBER+1]; ucNumber[SIZE_NUMBER]='\0';
ucName =new unsigned char[SIZE_NAME+1]; ucName[SIZE_NAME]='\0';
ucAdress =new unsigned char[SIZE_ADRESS+1]; ucAdress[SIZE_ADRESS]='\0';
ucTelephone =new unsigned char[SIZE_TELEPHONE+1]; ucTelephone[SIZE_TELEPHONE]='\0';
ucCodeERDPOU=new unsigned char[SIZE_ERDPOU+1]; ucCodeERDPOU[SIZE_ERDPOU]='\0';
ucIPN =new unsigned char[SIZE_IPN+1]; ucIPN[SIZE_IPN]='\0';
ucNSpRPPnDV =new unsigned char[SIZE_NSPRPPNDV+1]; ucNSpRPPnDV[SIZE_NSPRPPNDV]='\0';
ucNumberRR =new unsigned char[SIZE_NUMBER_RR+1]; ucNumberRR[SIZE_NUMBER_RR]='\0';
}
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{ ulStatusConectDLL++; }break;
case DLL_THREAD_ATTACH:{}break;
case DLL_THREAD_DETACH:{}break;
case DLL_PROCESS_DETACH:
{ulStatusConectDLL--;
if(ulStatusConectDLL==0)
{
if(pDataOpenMapping!=NULL) UnmapViewOfFile(pDataOpenMapping);
if(hMapOpen!=NULL) CloseHandle(hMapOpen);
if(pDataCreateMapping!=NULL) UnmapViewOfFile(pDataCreateMapping);
if(hMapFile!=NULL) CloseHandle(hMapFile);
if(pDataBaset!=NULL){delete [] pDataBaset; pDataBaset=NULL;}
if(hFile!=NULL) fclose(hFile);
}
}break;
}
return TRUE;
}
EXPORT unsigned long WINAPI LoadFileInfoSubject(const char *NameFile)
{
if((hFile=fopen(NameFile,"r"))==NULL) return GetLastError();
else
{
fseek(hFile,0,SEEK_END);
if(fgetpos(hFile,&ulSizeFile)!=0) return GetLastError();
fseek(hFile,0,SEEK_SET);
if(ulSizeFile%ALL_SIZE_ONE_STRUCT!=0) return ERROR_SIZE_BD;
if(ulSizeFile==0) return EMPTY_FILE;
uiSizeStruct=(unsigned int)ulSizeFile/ALL_SIZE_ONE_STRUCT;
if(pDataBaset!=NULL){delete [] pDataBaset; pDataBaset=NULL;}
pDataBaset=new DATABASET[uiSizeStruct];
for(unsigned int i=0; i<uiSizeStruct; i++)
{
fread(pDataBaset.ucNumber,sizeof(unsigned char),SIZE_NUMBER,hFile);
fread(pDataBaset.ucName,sizeof(unsigned char),SIZE_NAME,hFile);
fread(pDataBaset.ucAdress,sizeof(unsigned char),SIZE_ADRESS,hFile);
fread(pDataBaset.ucTelephone,sizeof(unsigned char),SIZE_TELEPHONE,hFile);
fread(pDataBaset.ucCodeERDPOU,sizeof(unsigned char),SIZE_ERDPOU,hFile);
fread(pDataBaset.ucIPN,sizeof(unsigned char),SIZE_IPN,hFile);
fread(pDataBaset.ucNSpRPPnDV,sizeof(unsigned char),SIZE_NSPRPPNDV,hFile);
fread(pDataBaset.ucNumberRR,sizeof(unsigned char),SIZE_NUMBER_RR,hFile);
}//End for
}//end else
fclose(hFile);
if(pDataCreateMapping!=NULL) UnmapViewOfFile(pDataCreateMapping);
if(hMapFile!=NULL) CloseHandle(hMapFile);
hMapFile=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,
0,(unsigned long)ulSizeFile,NAME_FILE_MAPPING);
if(hMapFile==NULL) return GetLastError();
pDataCreateMapping=(LPDATABASET)MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,
0,0,(unsigned long)ulSizeFile);
if(pDataCreateMapping==NULL) return GetLastError();
CopyMemory((void*)pDataCreateMapping,pDataBaset,(unsigned long)ulSizeFile);
return 0;
}
EXPORT LPDATABASET WINAPI GetAdressArrey(void)
{
if(pDataOpenMapping!=NULL)UnmapViewOfFile(pDataOpenMapping);
if(hMapOpen!=NULL) CloseHandle(hMapOpen);
hMapOpen=OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,NAME_FILE_MAPPING);
if(hMapOpen==NULL) return NULL;
pDataOpenMapping=(LPDATABASET)MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,(unsigned long)ulSizeFile); return pDataOpenMapping;
Общий доступ к памяти, распределенной DLL
Как мне можно сделать так что бы первое приложение когда уже загрузило в память файл, то другое, приложение, просто могло обратиться к области выделенной памяти и обработать данные?
Цитата: AVDEY
У меня массив структур, в котором находиться информация из файла.
Как мне можно сделать так что бы первое приложение когда уже загрузило в память файл, то другое, приложение, просто могло обратиться к области выделенной памяти и обработать данные?
Как мне можно сделать так что бы первое приложение когда уже загрузило в память файл, то другое, приложение, просто могло обратиться к области выделенной памяти и обработать данные?
По всей видимости это прото не возможно. Если я не ошибаюсь то винда не дает лезть в кучу друго приложения. Для решения подобной задачи лучше всего реализовать обмен данными между процессами, к примеру используя сокеты.
З.Ы. Но я могу и ошибаться, возможно все-таки и есть способ поднять данные из другого процесса.
Смотри в сторону Memory Mapped Files
А мне надо что бы был доступ уже к массиву структур заполнену данными из файла.
Иначе все равно прийдеться разделять файл, каждый раз при обращении к нему другого приложения. Тоесть создавать массив структур и тем самым вдвое больше занимать виртуальной памяти.
Ты не правильно понял. Читай внимательнее.
Буду рад если дадите ссылку или небольшой примерчик.
Пожалуйста. Не успеваю ;(.
http://msdn2.microsoft.com/en-us/library/aa366551(VS.85).aspx
вот другой метод, через shared section:
http://support.microsoft.com/kb/125677
вот другой метод, через shared section:
http://support.microsoft.com/kb/125677
(LPDATABASET)MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,(unsigned long)ulSizeFile);
возвращает NULL. А по GetLastError()==11 - ERROR_BAD_FORMAT
An attempt was made to load a program with an incorrect format.
Код DLL
Код:
Первая программа вызывает LoadFileInfoSubject и GetAdressArrey и все нормально, а вторая только функцию GetAdressArrey и указатель ==NULL;
Помогите разобраться.