Вопрос: С++ | Добавлено: 22.01.05 00:01 |
Автор вопроса: ![]() |
Хочу сделать библию на VС++6.0 для хука на клаву (чтобы использовать такую, какая мне нужна, а не такую какая есть), но есть проблемы:
1. События организовывать я не собираюсь, но и ставить SetWindowLong внутри своего VB'шного приложения мне тоже не климатит. Поэтому хочу сделать CallBack функцию. Ест-но через AddressOf. Но вот на стороне библии не могу приравнять предыдущий указатель на функцию на новую. Делаю так: void CallBackFunc(int hWnd,int uMsg,int KeyCode); int SetHook(int CBFuncAddr) { int rez; //CallBackFunc=CBFuncAddr; memcpy(&CallBackFunc,&CBFuncAddr,4); CallBackFunc(555,111,111); SysHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC) SysMsgProc,(HINSTANCE) Module,0); rez=(int) SysHook; return rez; }; Вылетает. Что делать? Та же хрень с lParam в функции SysMsgProc, которая видать является указателем на структуру tagMSG, но приравнять не получается, т.к. lParam - long'оподобный. В дельфях есть это: TMsg(Pointer(lParam)^).message А в С++ что делать? 2. Она блин здоровая выходит (~200Kb), хотя кода в ней шиш да маленько. Убираю галки в Link получается 64. Можно ли ещё уменьшить размер и будет ли моя библия работать на всех компах без галки Link Incrementally? |
Ответы | Всего ответов: 23 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 22.01.05 00:49 |
1. Лень думать, но, наверно, проблема с приведением типов
2. Вставь следующие строчки в начале файла: #pragma comment(linker,"/MERGE:.rdata=.text" ![]() #pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078" ![]() #pragma comment(linker,"/ENTRY:New_WinMain" ![]() #pragma comment(linker,"/NODEFAULTLIB" ![]() И поменя объявление функции точки входа на New_WinMain |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 22.01.05 00:57 |
2 Поставь что посоветовал Sharp и про memcpy как и про многие другие фишки сможешь забыть ![]() Может проще тебе на PB написать и привычней и меньше ![]() |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 247906854 Вопросов: 133 Ответов: 882 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 22.01.05 01:23 |
А вас ист дас РВ и с чем его едят?
А-а-а. PowerBasic? Я его в глаза не видел. А он тяжёлый? С инета скачать можно? Просто я часто замечаю как про него говорят, что длл на нём писать - самое оно. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 22.01.05 03:02 |
весит немного, метра четыре не более вот что у меня в txt файле рядом с закачкой:
Name: Powerbasic.For.windows.v7.04.rar
URL: http://soft.0zones.com/SoftDown.asp?ID=13509 Size: 3977471 Create time: 21.08.2004 21:10:55 Complete time: 28.08.2004 20:47:58 Referer: Description: 512413803 512420370 512479616 512424330 Есть-ли он там, не знаю, но брал его оттуда я... |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 22.01.05 03:03 |
Ох... только думаю удалят этот пост... |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 22.01.05 19:11 |
Насчет локальных переменных - не встречался с таким, приведи, плиз, пример. А memcpy и так не стоит юзать - лучше сразу CopyMemory. Причем, если убрать строку с NODEFAULTLIB, размер ехешника увеличивается очень мало, основной вклад делает изменение точки входа, ибо отбрасывается стандартный Сишный стуб. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 247906854 Вопросов: 133 Ответов: 882 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 23.01.05 00:11 |
PB счас скачаю, но библию на С++ доделать всё-таки решил, т.к. чего уж отступать-то? 8)
CallBack реализовал так: Обявляю тип и саму функцию (как без типа я не понял): typedef void (WINAPI *PFN_CallBack)(int hWnd,int uMsg,int KeyCode); PFN_CallBack CallBackFunc; При получении нового адреса: CallBackFunc=(PFN_CallBack) CBFuncAddr; CallBackFunc(555,111,111); // собственна - пошло поехало... Это уже с успехом работает, но выявилась новая проблема. Функции из библиотеки я экспортирую так: extern "C" __declspec(dllexport) void GetInt(int a); И экзешник, написанный на VB вызывает такие функции на "ура". НО! Когда я вызываю эти функции из-под самого VB, то функция ВЫПОЛНЯЕТСЯ, но при этом вылезает ошибка 49 - "Неверный вызов Dll". Чо за х... хрень, в общем? До этого я делал библии в Borland C++, и там при экспртировании делалось так: extern "C" __declspec(dllexport) void _stdcall GetInt(int a); т.е. _stdcall добавлялось. Если делаю эту хрень в VC++, то компилится нормально, а при вызове вылетает 48-я ошибка "Не нашёл точку входа". Как надо Правильно экспортировать функции? |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 247906854 Вопросов: 133 Ответов: 882 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 23.01.05 00:15 |
А чего на том сайте пароль и логин какой-то требуют?.. |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 23.01.05 01:45 |
2Neco, у мня не требовали, надо - выложу
2Sharp, WIN32_FIND_DATA FindFileData пришлось объявлять как указетель: LPWIN32_FIND_DATA FindFileData; Если ук-ть как в первом случае - ошибка! Теперь невозможность откомпилировать в Debug, тока в Release... |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #10 | Добавлено: 23.01.05 03:58 |
пришлось объявлять как указетель:
LPWIN32_FIND_DATA FindFileData; Вряд ли это как-то непосредственно связано Теперь невозможность откомпилировать в Debug, тока в Release...
А кто тебе мешает написать #ifdef RELEASE #pragma ... #endif ? |
Номер ответа: 11 Автор ответа: ![]() ![]() Вопросов: 5 Ответов: 12 |
Профиль | Цитата | #11 | Добавлено: 23.01.05 08:57 |
Попробуй так вызвать, т.е. вместо void какой-нибудь возвращаемый тип данных:
extern "C" _declspec(dllexport) long __stdcall MyFunction(long a,long b) И ещё надо учитывать, что Visual C++ немного изменяет название экспортируемой функции, т.е. вместо MyFunction будет _MyFunction@8! А объявление в VB следовательно будет: Private Declare Function MyFunction Lib "1.dll" Alias "_MyFunction@8" (ByVal x1 As Long, ByVal x2 As Long) As Long |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #12 | Добавлено: 23.01.05 12:54 |
Sharp, а ты не рассуждай, ты попробуй ![]() |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 23.01.05 15:05 |
И ещё надо учитывать, что Visual C++ немного изменяет название экспортируемой функции, т.е. вместо MyFunction будет _MyFunction@8!
Манглинг отключается созданием файла .def Sharp, а ты не рассуждай, ты попробуй
![]() Мне лень, но второе точно должно работать. |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #14 | Добавлено: 23.01.05 21:46 |
Второе оно понятно ![]() ![]() |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #15 | Добавлено: 23.01.05 22:04 |
Первое действительно нонсенс, поэтому я в это и не верю. Найдешь объяснение - поверю ![]() |
|