Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: С++ Добавлено: 22.01.05 00:01  

Автор вопроса:  Neco | Web-сайт: neco.pisem.net | ICQ: 247906854 
Хочу сделать библию на 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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #2
Добавлено: 22.01.05 00:57
2 Поставь что посоветовал Sharp и про memcpy как и про многие другие фишки сможешь забыть :))) Даже локальную переменную толком объявить нельзу будет (пользовательского типа)

Может проще тебе на PB написать и привычней и меньше ;)

Ответить

Номер ответа: 3
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #3
Добавлено: 22.01.05 01:23
А вас ист дас РВ и с чем его едят?
А-а-а. PowerBasic? Я его в глаза не видел. А он тяжёлый? С инета скачать можно? Просто я часто замечаю как про него говорят, что длл на нём писать - самое оно.

Ответить

Номер ответа: 4
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 22.01.05 03:03
Ох... только думаю удалят этот пост...

Ответить

Номер ответа: 6
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #6
Добавлено: 22.01.05 19:11
Насчет локальных переменных - не встречался с таким, приведи, плиз, пример. А memcpy и так не стоит юзать - лучше сразу CopyMemory. Причем, если убрать строку с NODEFAULTLIB, размер ехешника увеличивается очень мало, основной вклад делает изменение точки входа, ибо отбрасывается стандартный Сишный стуб.

Ответить

Номер ответа: 7
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #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-сайт: neco.pisem.net
 Профиль | | #8
Добавлено: 23.01.05 00:15
А чего на том сайте пароль и логин какой-то требуют?..

Ответить

Номер ответа: 9
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #10
Добавлено: 23.01.05 03:58
пришлось объявлять как указетель:
LPWIN32_FIND_DATA FindFileData;

Вряд ли это как-то непосредственно связано
Теперь невозможность откомпилировать в Debug, тока в Release...

А кто тебе мешает написать
#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-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 23.01.05 12:54
Sharp, а ты не рассуждай, ты попробуй ;)

Ответить

Номер ответа: 13
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #13
Добавлено: 23.01.05 15:05
И ещё надо учитывать, что Visual C++ немного изменяет название экспортируемой функции, т.е. вместо MyFunction будет _MyFunction@8!

Манглинг отключается созданием файла .def
Sharp, а ты не рассуждай, ты попробуй ;)

Мне лень, но второе точно должно работать.

Ответить

Номер ответа: 14
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #14
Добавлено: 23.01.05 21:46
Второе оно понятно :) А первое - нонсенс :)

Ответить

Номер ответа: 15
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #15
Добавлено: 23.01.05 22:04
Первое действительно нонсенс, поэтому я в это и не верю. Найдешь объяснение - поверю :)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам