Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: private members DEVMODE структуры.  (Прочитано 15065 раз)
0 Пользователей и 1 Гость смотрят эту тему.
remedius
Гость
« : 14-05-2006 13:26 » 

Здравствуйте!
Пробовал ли кто-нибудь передавать данные из одного плагина в другой через private область DEVMODE структуры?
Я использовала DDK пример - OEMDEV структуру. Добавила поле в стуктуру и даные перестали передаваться. Записываю я следующим образом:
LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam) 

...... 
PCBUSERDATA   pUserData = (PCBUSERDATA) pCallbackParam->UserData; 
POEMDEV   pOEMDev = (POEMDEV)pUserData->pOEMUIParam->pOEMDM; 
........ 
pOEMDev->dwDriverData1 = 1; 
pOEMDev->dwDriverData2 = 2; 
pOEMDev->dwDriverData3 = 3; 
....... 
}
Может private область должна еще быть где-нить описана?
Спасибо
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 14-05-2006 13:55 » 

С даной структорой не знаком. Но судя по логике. Ты изменила описание структуры и естественно поменяла размер. Многие API функции проверяют размер передаваемой структуры, и если он не верен, возрашают ошибку.
Вот посмотрел в MSDN http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_8nle.asp описание структуры.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
remedius
Гость
« Ответ #2 : 14-05-2006 14:32 » 

С даной структорой не знаком. Но судя по логике. Ты изменила описание структуры и естественно поменяла размер. Многие API функции проверяют размер передаваемой структуры, и если он не верен, возрашают ошибку.
Вот посмотрел в MSDN http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_8nle.asp описание структуры.

структура имеет вид:
Код:
typedef struct tagOEMDEV
{
    OEM_DMEXTRAHEADER   dmOEMExtra;
     
BOOL                dwDriverData;
BOOL                dwDriverData1;

} OEMDEV, *POEMDEV;

Размер структуры указывается в одном из поле dmOEMExtra. Я присваиваю sizeof(OEMDEV).
В примере ДДК размер они больше никакой не устанавливают. Т.е. напрямую поле dmDriverExtra не заполняют. Т.е. думаешь еще прописать напрямую размер в dmDriverExtra? Почему же в их тогда варианте все прокатывает? (я добавила только dwDriverData1)
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #3 : 17-05-2006 07:21 » 

Не совсем понимаю проблемму, но зачем делать именно так?
Ведь сушествует масса способой обмениватся данными между процессами.
Записан
remedius
Гость
« Ответ #4 : 17-05-2006 13:57 » 

Дело в том, что типо это сичтается "правильно". Т.е. private область DEVMODE структуры как раз и предназначена для обмена информацией между плагинами. Я конечно могу завести общую область памяти и повесить семафор какой-нить. Но раз написано в ДДК,что надо так, очень бы хотелось реализовать. Тем более вообще мне не поняно, почему не получается добавить поля.Там навеняка какая-нить загвоздка маленькая, а понять в чем я не могу:( Вот и обращаюсь за помощью, может имел кто с этим дело.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 17-05-2006 18:55 » 

Саму структуру нельзя менять. Там нет зашишенных или приватных полей. Это не ООП. Скорее всего используется одно поле, в котором записывается ссылка на твои данные. Хотя такое нельзя делать в межпроцессорном обмене.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
remedius
Гость
« Ответ #6 : 18-05-2006 15:50 » 

Саму структуру нельзя менять. Там нет зашишенных или приватных полей. Это не ООП. Скорее всего используется одно поле, в котором записывается ссылка на твои данные. Хотя такое нельзя делать в межпроцессорном обмене.
Ты в этом уверен?
Я тут напала на версию ДДК под Server 2003, которую они щас распространяют платно. Зацени что там написано:
Код:
//
//Can add info to the private devmode bellow here.
//Note :
// This structure must be prefixed by OEM_DMEXTRAHEADER
// Your plug-in must implement the IPrintOemUI::DevMode method
//
typedef struct tagOEMDEV
{
    OEM_DMEXTRAHEADER   dmOEMExtra;
    DWORD               dwDriverData;
    DWORD               dwAdvancedData;

//
//Private DevMode Members
//

} OEMDEV, *POEMDEV;
Мало того что, они добавили сюда еще один DWORD, что у меня никак не получается+ они еще написали интересный комент.
« Последнее редактирование: 18-05-2006 16:07 от remedius » Записан
remedius
Гость
« Ответ #7 : 18-05-2006 15:54 » 

В ДДК, который я юзая следующим оразом:
Код:
////////////////////////////////////////////////////////
//      OEM Devmode Type Definitions
////////////////////////////////////////////////////////

typedef struct tagOEMDEV
{
    OEM_DMEXTRAHEADER   dmOEMExtra;
    BOOL                dwDriverData;

} OEMDEV, *POEMDEV;
И все...
Записан
remedius
Гость
« Ответ #8 : 18-05-2006 16:06 » 

Да, кстати это очень даже хорошая идея на счет ссылки. Но зачем же они в качестве примера туда записывают не ссылку на данные, а номер выбранного поля в комбобоксе? (по моему это достаточно тогда не удачный пример + эти модули наверняка в разных процессах выполняются. Здесь была моя ладья...
« Последнее редактирование: 18-05-2006 16:22 от remedius » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 18-05-2006 19:07 » 

remedius, Microsoft вправе менять внутрение структуры по своему усмотрению. Они моду диктуют. Поэтому и сушествуют DDK под каждую платформу отдельно. Под рукой сейчас нету DDK. Приведи пожайлуста пример самого кода использования. Чтобы не спорить по пустому. На живом примере будем разбираться.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
remedius
Гость
« Ответ #10 : 18-05-2006 19:16 » 

remedius, Microsoft вправе менять внутрение структуры по своему усмотрению. Они моду диктуют. Поэтому и сушествуют DDK под каждую платформу отдельно. Под рукой сейчас нету DDK. Приведи пожайлуста пример самого кода использования. Чтобы не спорить по пустому. На живом примере будем разбираться.

вот так записывается в одном модуле:
Код:
PCBUSERDATA   pUserData = (PCBUSERDATA) pCallbackParam->UserData; 
POEMDEV   pOEMDev = (POEMDEV)pUserData->pOEMUIParam->pOEMDM;
........
pOEMDev->dwDriverData1 = 1;
pOEMDev->dwDriverData2 = 2; 

Вот так считывается в другом модуле:
Код:
 PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev; //SURFOBJ *pso
 POEMDEV poemdev = (POEMDEV)pdevobj->pOEMDM;

соответсвенно в функции DEVMODE происходит копирование:
Код:
HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam)
{
 POEMDEV pOEMDevIn;
    POEMDEV pOEMDevOut;
...
 pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn;
    pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut;
...
   memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize));
...
}
Это все вкратце
Записан
remedius
Гость
« Ответ #11 : 26-05-2006 07:28 » 

Забила я на этот DEVMODE, решила завести свою shared memory. Но она не рвботает:( Помогите разобраться пожалуйста:
Например есть Процесс1 и Процесс2. На примере аpp все работает,   а вот в этом драйвере -нет
Процесс1 пишет, Процесс2-читает и создает sharedMemory.
Процесс1:
Код:
HANDLE hMapFile;
....
hMapFile = OpenFileMapping(
                   FILE_MAP_ALL_ACCESS,   // read/write access
                   FALSE,                 // do not inherit the name
                   MemName);               // name of mapping object
   if( hMapFile != NULL )
   {
   pBuf = (PSHAREDDATA) MapViewOfFile(hMapFile, // handle to map object
               FILE_MAP_ALL_ACCESS,  // read/write permission
               0,                   
               0,                   
               BUF_SIZE);
   if(pBuf == NULL)
   {
     VERBOSE(DLLTEXT("pBuf is NULL\r\n"));
   }
   else
   {
   pBuf->iMem =  pOEMUIParam->pOEMOptItems[0].Sel;
   wcscpy( pBuf->message, pOEMUIParam->pOEMOptItems[1].pSel );
   
   VERBOSE(DLLTEXT("Writing!\r\n"));
   VERBOSE(__TEXT("Writing!  TEXT = %s ; Number = %d\r\n"),pBuf->message, pBuf->iMem);
   UnmapViewOfFile(pBuf);
   CloseHandle(hMapFile);
   }
   }
   else
   {
   VERBOSE(DLLTEXT("Not_Found_OEM!\r\n"));
   }
Пишет -все OK

Процесс2 - создание:
Код:
......
if( (hMapFile == NULL) && ((hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,MemName)) == NULL))
{
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE,    // use paging file
NULL,                    // default security
PAGE_READWRITE,          // read/write access
0,                       // max. object size
BUF_SIZE,                // buffer size 
MemName);                 // name of mapping object
   if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
   hMapFile = NULL;
   else
   VERBOSE(DLLTEXT("Creating!\r\n"));
}
....

Процесс2 - чтение:
Код:
extern HANDLE hMapFile;
........
        PSHAREDDATA pBuf = NULL;
if( hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
VERBOSE(DLLTEXT("Not_Found_DDIHOOK!\r\n"));

else
pBuf = (PSHAREDDATA) MapViewOfFile(hMapFile, // handle to map object
               FILE_MAP_ALL_ACCESS,  // read/write permission
               0,                   
               0,                   
               BUF_SIZE);


if( pBuf == NULL )
{
//***************************
    TCHAR szBuf[80];
    LPVOID lpMsgBuf;
    DWORD dw = GetLastError();

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

    wsprintfW(szBuf,
        L"failed with error %d: %s",
         dw, lpMsgBuf);
 
  //  MessageBox(NULL, szBuf, "Error", MB_OK);

    LocalFree(lpMsgBuf);
//****************************

VERBOSE(__TEXT("Not_Mapping! %s\r\n"), szBuf);
}
else
{
VERBOSE(DLLTEXT("Reading!\r\n"));
        VERBOSE(__TEXT("Text = %s; Naumber = %d\r\n"),pBuf->message ,pBuf->iMem);
UnmapViewOfFile(pBuf);
}

if( hMapFile != NULL )
{
CloseHandle( hMapFile );
hMapFile = NULL;
VERBOSE(DLLTEXT("Deleting!\r\n"));
}

А вот тут происходят для меня странные вещи:
pBuf = NULL, a GetLastError возвращает success

Спасибо Не понял
Записан
remedius
Гость
« Ответ #12 : 26-05-2006 07:29 » 

Да, еще в обоих процессах процессах объявлено:
Код:
typedef struct SHAREDDATA
{
DWORD iMem;
wchar_t message[256];
} SHAREDDATE, *PSHAREDDATA;

#define BUF_SIZE sizeof(SHAREDDATA)
#define MemName L"SharedMemory"
Записан
remedius
Гость
« Ответ #13 : 26-05-2006 11:52 » 

Хотите верьте, хотите нет, но вот этот код работает:
Код:
       PSHAREDDATA pBuf = NULL;
if( hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
{
VERBOSE(DLLTEXT("Not_Found_DDIHOOK!\r\n"));
}
else
{
pBuf = (PSHAREDDATA) MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS, 0,0,BUF_SIZE);

if( pBuf == NULL )
{
//***************************
    TCHAR szBuf[80];
    LPVOID lpMsgBuf;
    DWORD dw = GetLastError();

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );
 
    wsprintfW(szBuf,
        L"failed with error %d: %s",
         dw, lpMsgBuf);
 
  //  MessageBox(NULL, szBuf, "Error", MB_OK);

    LocalFree(lpMsgBuf);
//****************************

VERBOSE(__TEXT("Not_Mapping! %s\r\n"), szBuf);
}
else
{
VERBOSE(DLLTEXT("Reading!\r\n"));
 
VERBOSE(__TEXT("Text = %s; Naumber = %d\r\n"),pBuf->message ,pBuf->iMem);
UnmapViewOfFile(pBuf);
}


CloseHandle( hMapFile );
hMapFile = NULL;
VERBOSE(DLLTEXT("Deleting!\r\n"));

}

После такого становится вообще страшно пользоваться компилятором ддк...(ведь если я не ошибаюсь...он за это в ответе.. Улыбаюсь
Записан
remedius
Гость
« Ответ #14 : 26-05-2006 11:57 » new


P.S. Это стало ясно после:
int a=0;
if(...)a=1;else a=2;
а в итоге было a=0.
 Да-да Клево!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines