![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| kichum |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.10.2008 Репутация: нет Всего: нет |
Здравствуйте. Столкнулся с проблемой написания Dde сервера. При инициализации нужно указать PFNCALLBACK, но функция является методом класса (DDESrv) и делать ее статической не хочется. Нашел на просторах интернета пример thunk, который я благополучно использовал, но выявилась проблема: входные параметры как будто сдвинуты влево (запускал без переходника и спереходником. входные параметры похожи на вызов без переходника но кажется что uType = uFmt, uFmt = hconv и т.д. { более понятно не смог обьяснить }).
Вот это я взял из сети:
а так я это использую:
Вот прототип колбека (чтобы было понятно что там с параметрами):
Может это не универсальный переходник или я что-то не так делаю, но в асме я плох. Может что-то в стеке не так или еще что? Прошу помощи. |
||||||
|
|||||||
| Akira |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 26.3.2012 Репутация: нет Всего: нет |
Сути проблемы я если честно не понял (не выспался) но возможно проблема из за calling conventions... __cdecl, __stdcall
Залей скомпиленный сэмпл. Это сообщение отредактировал(а) Akira - 16.4.2012, 10:48 |
|||
|
||||
| kichum |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.10.2008 Репутация: нет Всего: нет |
Семпл - пример? Если да, то прикрепляю скомпилированный в Debug на VC++2010
Присоединённый файл ( Кол-во скачиваний: 3 )
tmp.rar 9,13 Kb |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Во первых - ваш thunk использует вполне конкретный calling conversion для вызова, и не факт, что VS использует тот же. Во вторых, ваш pvoid_cast предполагает, что размер void* и указателя на метод совпадают, что так же может не соотвествовать действительности
Почему? Обычно так и делают. (Точнее делают статический переходник, который вызывает функцию класса. А this ему передают в глобале) Это сообщение отредактировал(а) xvr - 16.4.2012, 12:23 |
|||
|
||||
| kichum |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.10.2008 Репутация: нет Всего: нет |
xvr, да, возможно так и правильнее сделать и если не сложно, подскажите поподробнее. Вот у меня библиотечная функция инициализации. Я не могу передать ей параметров больше или меньше, чем задано (т.е. указатель this я передать не могу). Т.к. объектов класса может быть больше чем один (класс не синглтон) то как передать ей этот указатель this если не делать каждый обьект класса глобальным?
Это сообщение отредактировал(а) kichum - 16.4.2012, 12:45 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
У вас количество этих объектов фиксированное? Т.е. можно заранее сказать, что их не будет больше, чем N (некая константа)? Далее, формат этих функций фиксирован? Т.е. можно заранее прописать все нужные наборы параметров? Если да, то этот вопрос решается довольно просто (и без ассемблерных thunk'ов) |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
судя по прототипам, не очень продуманный API (по всей видимости, интерфейс вымирающий),
но возможно, если покопаться в документации, где-то в недрах DDE есть тот самый app-user-data, в который можно поместить this, и который можно получить из какого-нить дескриптора, передающегося в колбек -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: 3 Всего: 14 |
откуда берется jmp 0x042444C7 ? -------------------- |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |