Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Общий доступ к памяти, распределенной DLL

538
17 апреля 2008 года
AVDEY
188 / / 17.11.2005
У меня массив структур, в котором находиться информация из файла.
Как мне можно сделать так что бы первое приложение когда уже загрузило в память файл, то другое, приложение, просто могло обратиться к области выделенной памяти и обработать данные?
370
18 апреля 2008 года
koval
443 / / 29.08.2005
Цитата: AVDEY
У меня массив структур, в котором находиться информация из файла.
Как мне можно сделать так что бы первое приложение когда уже загрузило в память файл, то другое, приложение, просто могло обратиться к области выделенной памяти и обработать данные?



По всей видимости это прото не возможно. Если я не ошибаюсь то винда не дает лезть в кучу друго приложения. Для решения подобной задачи лучше всего реализовать обмен данными между процессами, к примеру используя сокеты.

З.Ы. Но я могу и ошибаться, возможно все-таки и есть способ поднять данные из другого процесса.

3
18 апреля 2008 года
Green
4.8K / / 20.01.2000
Смотри в сторону Memory Mapped Files
538
18 апреля 2008 года
AVDEY
188 / / 17.11.2005
На сколько я понял Memory Mapped Files это проекция файла в память.
А мне надо что бы был доступ уже к массиву структур заполнену данными из файла.
Иначе все равно прийдеться разделять файл, каждый раз при обращении к нему другого приложения. Тоесть создавать массив структур и тем самым вдвое больше занимать виртуальной памяти.
3
18 апреля 2008 года
Green
4.8K / / 20.01.2000
Ты не правильно понял. Читай внимательнее.
538
19 апреля 2008 года
AVDEY
188 / / 17.11.2005
А если не сложно можно, можно по конкретней, так как время поджимает?!
Буду рад если дадите ссылку или небольшой примерчик.
Пожалуйста. Не успеваю ;(.
3
19 апреля 2008 года
Green
4.8K / / 20.01.2000
http://msdn2.microsoft.com/en-us/library/aa366551(VS.85).aspx

вот другой метод, через shared section:
http://support.microsoft.com/kb/125677
538
19 апреля 2008 года
AVDEY
188 / / 17.11.2005
Ну все равно чот не получается. Первая программа загружается все нормально а вторая дает ошибку при
(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
Код:
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;

Первая программа вызывает LoadFileInfoSubject и GetAdressArrey и все нормально, а вторая только функцию GetAdressArrey и указатель ==NULL;
Помогите разобраться.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог