Страница: 1 | 2 |
Вопрос: С++
Добавлено: 22.01.05 00:01
Автор вопроса: Neco | Web-сайт:
Хочу сделать библию на 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
Автор ответа:
Sharp
Лидер форума
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
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 22.01.05 00:57
2 Поставь что посоветовал Sharp и про memcpy как и про многие другие фишки сможешь забыть )) Даже локальную переменную толком объявить нельзу будет (пользовательского типа)
Может проще тебе на PB написать и привычней и меньше
Номер ответа: 3
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #3
Добавлено: 22.01.05 01:23
А вас ист дас РВ и с чем его едят?
А-а-а. PowerBasic? Я его в глаза не видел. А он тяжёлый? С инета скачать можно? Просто я часто замечаю как про него говорят, что длл на нём писать - самое оно.
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 22.01.05 03:02
весит немного, метра четыре не более вот что у меня в txt файле рядом с закачкой:
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
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 22.01.05 03:03
Ох... только думаю удалят этот пост...
Номер ответа: 6
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #6
Добавлено: 22.01.05 19:11
Насчет локальных переменных - не встречался с таким, приведи, плиз, пример. А memcpy и так не стоит юзать - лучше сразу CopyMemory. Причем, если убрать строку с NODEFAULTLIB, размер ехешника увеличивается очень мало, основной вклад делает изменение точки входа, ибо отбрасывается стандартный Сишный стуб.
Номер ответа: 7
Автор ответа:
Neco
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
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #8
Добавлено: 23.01.05 00:15
А чего на том сайте пароль и логин какой-то требуют?..
Номер ответа: 9
Автор ответа:
sne
Разработчик 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
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #10
Добавлено: 23.01.05 03:58
LPWIN32_FIND_DATA FindFileData;
Вряд ли это как-то непосредственно связано
А кто тебе мешает написать
#ifdef RELEASE
#pragma ...
#endif
?
Номер ответа: 11
Автор ответа:
Brusco
Вопросов: 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
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 23.01.05 12:54
Sharp, а ты не рассуждай, ты попробуй
Номер ответа: 13
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #13
Добавлено: 23.01.05 15:05
Манглинг отключается созданием файла .def
Мне лень, но второе точно должно работать.
Номер ответа: 14
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #14
Добавлено: 23.01.05 21:46
Второе оно понятно А первое - нонсенс
Номер ответа: 15
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #15
Добавлено: 23.01.05 22:04
Первое действительно нонсенс, поэтому я в это и не верю. Найдешь объяснение - поверю