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
Спокойный
Администратор
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 » |
|
структура имеет вид: typedef struct tagOEMDEV { OEM_DMEXTRAHEADER dmOEMExtra; BOOL dwDriverData; BOOL dwDriverData1; } OEMDEV, *POEMDEV;
Размер структуры указывается в одном из поле dmOEMExtra. Я присваиваю sizeof(OEMDEV). В примере ДДК размер они больше никакой не устанавливают. Т.е. напрямую поле dmDriverExtra не заполняют. Т.е. думаешь еще прописать напрямую размер в dmDriverExtra? Почему же в их тогда варианте все прокатывает? (я добавила только dwDriverData1)
|
|
|
Записан
|
|
|
|
IRP
Постоялец
Offline
|
|
« Ответ #3 : 17-05-2006 07:21 » |
|
Не совсем понимаю проблемму, но зачем делать именно так? Ведь сушествует масса способой обмениватся данными между процессами.
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #4 : 17-05-2006 13:57 » |
|
Дело в том, что типо это сичтается "правильно". Т.е. private область DEVMODE структуры как раз и предназначена для обмена информацией между плагинами. Я конечно могу завести общую область памяти и повесить семафор какой-нить. Но раз написано в ДДК,что надо так, очень бы хотелось реализовать. Тем более вообще мне не поняно, почему не получается добавить поля.Там навеняка какая-нить загвоздка маленькая, а понять в чем я не могу:( Вот и обращаюсь за помощью, может имел кто с этим дело.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
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
Спокойный
Администратор
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 » |
|
P.S. Это стало ясно после: int a=0; if(...)a=1;else a=2; а в итоге было a=0. Клево!
|
|
|
Записан
|
|
|
|
|