Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145

Сделать отладочную DLL (изменить cdecl на stdcall) для вызова из VB

29.12.2017, 14:02. Показов 5711. Ответов 77
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

А как обнаружить свой адрес при входе в функцию какой-либо DLL-ки ?
А по русски говоря: Сохранить регистр EIP.

У меня пришло на ум только это (в отладчике, asm-ом не занимаюсь):
Assembler
1
2
3
1000.1010     E8 0000.0000      Call xxxx.xxxx  // Тут ручками подбираем вызов "себе под нос"
1000.101E     59                Pop ecx
1000.101F     81E9 1E10.0000    Sub ecx, 101E   // Тут ручками подбираем до самого начала всей DLL-ки
Типа: Выцепили указатель на самое начало DLL (на header).

А не бывает ли на свете "ещё изящнее" решения ?

И это, ... все 52 фуни (!!! МОЕЙ !!!) DLL-ки поголовно при входе в EAX содержат свою точку входа.
Наверное это всё-таки "медвежья услуга" компилятора вызывающей программы ?
Стоит на это надеяться ? А то мож зря процедуру "себе под нос" затеваю ?

Заранее спасибо !
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2017, 14:02
Ответы с готовыми решениями:

Передача дополнительного аргумента в функцию stdcall/cdecl?
Всем доброго дня! Есть функция func вида: __stdcall void func() { cout<<"func"<<endl; }

Макрос для вызова подпрограмм с соглашением cdecl
как подключить в ассемблер Fasm соглашение вызова cdecl?

Передача структуры данных в DLL (stdcall)
Хочу передать данные следующей структуры в DLL: Поле1: Символьный тип, длинной 15 букв (Pole_1: String) Поле2: "Циферный"...

77
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
29.12.2017, 14:17
Gazzi, знак доллара возвратит текущий адрес
Assembler
1
mov ecx,$
..а твой код, это вычисление "дельта-смещения" http://govnokod.ru
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
29.12.2017, 22:45
Gazzi, давайте для начала определим – зачем это нужно?
Обычно адрес для позиционно-независимого кода (position independent code (PIC)) как раз так и получают:
Assembler
1
2
3
  call $+5  ; число 5 - для 32/64-битного кода
  pop eax
  ; eax = адрес инструкции pop eax
Ну или:
Assembler
1
2
3
4
5
6
  call geteip
; eax = текущий адрес
. . .
geteip:
  pop eax
  jmp eax
(для удобства использования или если вызовов call geteip не меньше 3-х).

R71MT, дельта-смещение – это всё же разность адресов, т.е.:
Assembler
1
2
3
    call XX
XX: pop eax
    sub eax,XX
А в примере TC как раз получение какого-то адреса относительно текущего.

Кто-то по ссылке R71MT написал, что при записи mov eax,$ (mov eax,offset $) будет сгенерирован фиксап. Тут надо быть аккуратным, т.к. не все ассеблеры (или не всегда) по умолчанию добавляют секцию фиксапов (даже в DLL, не говоря уже об EXE). Но если вы уверены, что она будет добавлена (в fasm это делается строкой section '.reloc' fixups data readable discardable), тогда вариант mov eax,$ (mov eax,offset $) будет самым простым и изящным

Добавлено через 7 минут
Для 64-битного режима можно вообще не парится и написать просто:
Assembler
1
lea rax,[$+7]
или (то же самое)
Assembler
1
2
lea rax,[xx]
xx:
Безо всяких фиксапов, т.к. там адресация относительная (RIP-relative).
Именно lea, т.к. операнд mov – фактически число, а не адрес, т.е. оно будет абсолютным, а не относительным...
1
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
30.12.2017, 19:04  [ТС]
R71MT
А куда засовывать "Доллар", в отладчик ?
Это готовая программа, а не Asm-проект.
... Дельта ...
Да какая разница, как это называется.
Ещё что-то есть на тему "выцепить EIP", или это единственный оператор, выцепляющий сей регистр (кроме конечно
переключения задачи) ?

Jin_X
... определим – зачем это нужно ...
Ну так в посте "Доступ к памяти" определили. Ну давайте ещё раз определим:
Имеется DLL-ка, от которой я потерял исходник. Она, зараза, написана Си-шниками, не нравится мне её выходы из
фуней по Ret-у. Мне надо по RETN-у. Вот и модернизирую ...

Фунуции при входе в EAX содержат свою точку входа.
Ну а про это кто/што может сказать ?

DLL-ка Win32, поэтому RAX не катит.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
31.12.2017, 12:00
Цитата Сообщение от Gazzi Посмотреть сообщение
Да какая разница, как это называется.
Разница есть, ибо используется по-разному.
Дельта так: mov eax,[ebx+MyVar], где ebx – дельта, а если имеется готовый адрес (с фиксапами), то можно без замороча написать mov eax,[MyVar]. Или если это адрес начала, то что-то типа mov eax,[ebx+MyVar-Start], где ebx – адрес начала программу (без фиксапа).

Цитата Сообщение от Gazzi Посмотреть сообщение
Ещё что-то есть на тему "выцепить EIP", или это единственный оператор, выцепляющий сей регистр (кроме конечно переключения задачи) ?
Да. Ну есть ещё, конечно, syscall и int, но они для данного случая не подойдут.

Цитата Сообщение от Gazzi Посмотреть сообщение
не нравится мне её выходы из фуней по Ret-у. Мне надо по RETN-у
А в чём разница?

Цитата Сообщение от Gazzi Посмотреть сообщение
Фунуции при входе в EAX содержат свою точку входа.
С чего это вдруг?
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
31.12.2017, 13:00  [ТС]
... Разница есть ...
В чём ?
Сколько надо, столько "смещения" и прибавлю к началу файла. И совершенно по барабану, как это обзывается.

... Syscall Int ...
Hу, прерывания наверное тут не нужны...
А вот syscall, это что за команда, какой у неё опкод, хотелось бы узнать ?

... Ret, Retn, в чём разница? ...
Стек "на место" ставит одна из них, а другая этого не делает.

... С чего это вдруг? ...
Вот и я УДИВЛЯЮСЬ !

(С наступающим всех ...)
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
01.01.2018, 11:01
Цитата Сообщение от Gazzi Посмотреть сообщение
А вот syscall, это что за команда, какой у неё опкод, хотелось бы узнать ?
syscall (0F 05) - это системный вызов, вызов функций ядра... используется обычно в Linux, а винде используется только внутри системных DLL.

Цитата Сообщение от Gazzi Посмотреть сообщение
... Ret, Retn, в чём разница? ...
Стек "на место" ставит одна из них, а другая этого не делает.
retn - это ret near, в Windows только она и используется обычно. Разница бывает, когда есть операнд или его нет. Но это не ret и retn, это ret и ret imm16 (ну или ret X можете назвать или т.п.)

p.s. С новым годом!
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
01.01.2018, 12:14  [ТС]
syscall
Ну мы всё равно с неё ничего не "выдоим" - забыли про неё.
"Нормальных" больше нет для получения EIP ?

RetN-ы ...

Мне надо:
RETN (код C3)

Заменить на:
RETN xx yy (код C2 yy xx)

Ну и что последняя делает со стеком ?
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
01.01.2018, 21:49
Цитата Сообщение от Gazzi Посмотреть сообщение
"Нормальных" больше нет для получения EIP ?
Нет.

Цитата Сообщение от Gazzi Посмотреть сообщение
RetN-ы ...
Ну хоть бы тогда пробел поставили

Добавлено через 50 секунд
Цитата Сообщение от Gazzi Посмотреть сообщение
Ну и что последняя делает со стеком ?
ret N читает (E)IP из стека и затем удаляет N байт из стека. Короче, грубо говоря:
Assembler
1
2
pop eip
add esp,N
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
02.01.2018, 01:35  [ТС]
- "Нормальных" больше нет для получения EIP ?
- Нет.
Тогда берём сию процедуру "на вооружение", записываем её в свою "шпаргалку",
и забываем об этом.

Переходим к следующему этапу:
1). Изменяем точку входа в DLL на свою, в "нашей" программной памяти в конце секции ".text".
2). Проделываем нужные процедуры. (Конкретно на данный момент):
а). Заносим в "нашу" память данных в конце секции ".data" версию, например вида "DBG v1.01",
а то потом запутаюсь в этих модернизируемых файлах.
б). Указатель на начало всей программы вида например: 1100.0000. Он же может быть и другим
(например 002E.0000), в зависимости куда DLL загрузится. На "общее" начало - это чтоб потом
легче в уме смещения на всяческие "свои" фишки высчитывать, а то пишу "криворучками".
3). Отдаём управление дальше, на штатную точку входа. Как я понял с помощью JMP, видимо ничего
не возвращает нам эта точка входа.

Какие-нибудь "подводные камни" всплывут при этой "технологии" ?

... Ну хоть бы тогда пробел поставили ...
Да что-то мне в "три оставшиеся извилины" запало, что RET - это "C3", а RETN - "C2 xx yy".
Буду внимательней.

... Фунуции при входе в EAX содержат свою точку входа ...
А этот "полином" так и не выяснен...
Вызываю их из VB6, и из IDE и из компилированной - Всё чётко, на каждой фуне свой адрес. (???)...
И в Нете ничо не обнаружил на эту тему...
Просто если это "так будет всегда" и из всех программ - то и первая часть "модернизации" не нужна.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
02.01.2018, 22:47
Jin X, есть еще способ:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FPU_ENVIRONMENT struct
 
    ControlWord         DWORD ?
    StatusWord          DWORD ?
    TagWord             DWORD ?
    InstructionPointer  PVOID ?
    CodeSegment         DWORD ?
    DataPointer         PVOID ?
    DataSegment         DWORD ?
    
FPU_ENVIRONMENT ends
 
...
 
    fldz
    sub esp, SIZEOF (FPU_ENVIRONMENT)
    fnstenv byte ptr [esp]
    mov eax, [esp][FPU_ENVIRONMENT.InstructionPointer]    ; в eax указатель на fldz
    add esp, SIZEOF (FPU_ENVIRONMENT)
Добавлено через 1 час 18 минут
Цитата Сообщение от Gazzi Посмотреть сообщение
Мне надо:
RETN (код C3)
Заменить на:
RETN xx yy (код C2 yy xx)
Т.е. получается cdecl соглашение было использовано (очистку стека производит вызывающая программа). Тогда должно быть известно количество аргументов для каждой функции, иначе задачу решить надежно не получится. Вы ведь не будете знать на сколько стек ровнять.

Цитата Сообщение от Gazzi Посмотреть сообщение
Переходим к следующему этапу:
1). Изменяем точку входа в DLL на свою, в "нашей" программной памяти в конце секции ".text".
2). Проделываем нужные процедуры. (Конкретно на данный момент):
а). Заносим в "нашу" память данных в конце секции ".data" ...
А зачем так сложно. Добавляете в импорт свою dll которая похучит функции в рантайме (в хуках равняем стек).
1
02.01.2018, 22:49

Не по теме:

Прошу прощения за оффтоп, у меня непонимание конечной цели ТС и теоретической части (моё развитие остановилось в DOS).

Ну вот исследуется некая dll - зачем нужен eip? Как только началось выполнение функции dll - какое содержимое eip будет:
- точно соответствующее команде из вызывающей программы?
- соответствующее некоему виртуальному адресу dll?

Ведь адреса всех программ пользовательского доступа - не настоящие, а виртуальные или что-то в этом роде.

Если нужно дополнительно передать данные в/из dll - не проще ли будет дизассемблированный код (без понимания, механически) довести до компиляции masm32 и в новую dll добавить/заменить обновлённую функцию с требуемыми свойствами? Или этот путь слишком затратный?

Какой технический смысл в телодвижениях ТС?

0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
02.01.2018, 23:14
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Ведь адреса всех программ пользовательского доступа - не настоящие, а виртуальные или что-то в этом роде.
В досовском EXE есть relocation table – таблица указателей (адресов), куда нужно добавить значение PSP. Т.е. когда мы пишем mov ax,@data, компилируется mov ax,5, например, и в relocation table добавляется адрес операнда этого mov'а. Когда программа загружается, то к 5 прибавляется PSP. Здесь работа идёт только с сегментами, смещения не меняются, они фиксированы.
В Windows используется плоская модель памяти, сегменты почти не используются (разве что FS, GS, SS). Основная программа грузится по фиксированному базовому виртуальному адресу (image base, обычно 400000h), поэтому ей можно не иметь этой таблицы (там она чуть по-другому работает, но суть та же), она для него бесполезна. А вот для DLL она нужна, т.к. в одно адресное пространство грузится сразу несколько DLL, поэтому они должны иметь разный адрес.
Для программы (и DLL) виртуальный адрес и есть самый настоящий, другие ему недоступны (и не нужны), несмотря на то, что физические адреса у них отличаются от виртуальных.
1
02.01.2018, 23:21

Не по теме:

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Какой технический смысл в телодвижениях ТС?
Как я понял, у ТС есть dll без исходного кода, в качестве соглашения о вызовах используется cdecl (очистку стека производит вызывающая программа). Т.е. функции возвращают управление через RET (0C3h) не очищая стек. ТС хочет сделать, чтобы было как в stdcall (очистку стека производит вызываемая подпрограмма).

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Ну вот исследуется некая dll - зачем нужен eip?
Видимо для дэльта смещения, что бы обращаться к адресам своего шелл-кода. К примеру след. код:

Assembler
1
2
3
4
5
6
7
     call Dlt
Dlt: pop edx
     lea eax, [edx + (offset String - offset Dlt)]    ; eax - pointer to string
 
     ret
    
     String db "Hello", 0
Скомпилируется в:

Assembler
1
2
3
4
5
00401000 >/$ E8 00000000    CALL Test.00401005
00401005  |$ 5A             POP EDX
00401006  |. 8D42 05        LEA EAX,DWORD PTR DS:[EDX+5]
00401009  \. C3             RETN
0040100A   . 48 65 6C 6C 6F>ASCII "Hello",0
Как видите код не имеет непосредственных адресов, он базонезависим и его можно исполнить расположив на любом адресе.

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Ведь адреса всех программ пользовательского доступа - не настоящие, а виртуальные или что-то в этом роде.
Да виртуальные, но это не важно.

0
03.01.2018, 00:00

Не по теме:

Цитата Сообщение от jupman Посмотреть сообщение
чтобы было как в stdcall
А на уровне ЯВУ разве не поддерживаются различные соглашения? Ведь даже WinAPI по этому признаку неоднороден (кроме wsprintf, всё stdcall). Или можно делать асм вставку для очистки стека после вызова функции из dll.

Нет, что-то ТС делает не то. Это не считая пагубного пути отказа от обновления dll производителем спектроанализатора (дал поиск по названию dll).

Вот чую - что истинное решение - во внимательном чтении документации. В её принятии, а не в утверждении гордыни, что умнее производителя, и последующем "допиливании". Или в замене спектроанализатора вместе с dll.

В любом случае - ТС общается на собственном "птичьем" языке и понять его непросто.

0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
03.01.2018, 09:08
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
А на уровне ЯВУ разве не поддерживаются различные соглашения?
Да, верно. Что-то меня понесло вчера, не нужно ничего перехватывать. Просто делаем хэндлер с сигнатурами функций и используем его из любого поддерживающего cdecl языка. Все.
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
03.01.2018, 12:10  [ТС]
jupman
Что это за манипуляции со структурой ?
Это что, меньше байт займёт чем CALL ... POP,
к чему это всё ?

... должно быть известно количество аргументов для каждой функции ...
Ну конечно же известно, и для каждой фуни. Описалово то любезно предоставлено.

... Добавляете в импорт свою dll ...
Вот тут недопонял, поподробней можно...

... у меня непонимание конечной цели ТС ...
Сделать stdcall отладочную DLL-ку.
... дизассемблированный код ... довести до компиляции masm32 и...
Ну а я "ручками" "Довожу до компиляции OllyDBG и..."

- зачем нужен eip ?
- что бы обращаться к адресам своего шелл-кода ...
Хоть один понимающий !

... А на уровне ЯВУ разве не поддерживаются различные соглашения ? ...
Вот это и можно было выяснить, какие ЯВУ какие деклы "держат",
прежде чем утверждать:
... Нет, что-то ТС делает не то. Это не считая пагубного пути отказа от обновления...
Какое ещё обновление, обновление чего ???

... истинное решение - во внимательном чтении документации ...
И что там будет "вычитано" применительно к данному вопросу ?
Не иначе: VB быстренько (втихушку) начнёт cdecl-ы переваривать ?

... утверждении гордыни ...
Где тут была какая гордыня ?

... умнее производителя, и последующем "допиливании".
Или в замене спектроанализатора вместе с dll ...
Огласите весь список пжлста, что мне ещё заменить, и с какими dll ?
Может быть для начала тещу/жену поучить, какие щи варить ?

... общается на собственном "птичьем" языке ...
Вы, уважаемый, ни одного совета не дали, ни на "птичьем", ни на каком другом.

... используем его из любого поддерживающего cdecl языка ...
А зачем вообще что-то модернизировать, если она и так вызывается
из языка, поддерживающего cdecl ?

В конце-концов: Заданы два конкретных вопроса:
1). На какие "подводные камни" можно наткнуться, создавая свою DLLEntyPoint ?
2). Почему каждая фуня на входе в EAX содержит свой адрес ?
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
03.01.2018, 14:04
Цитата Сообщение от Gazzi Посмотреть сообщение
Что это за манипуляции со структурой ?
Это что, меньше байт займёт чем CALL ... POP,
к чему это всё ?
Ну, Jin X сказал, что другого способа нет. Просто дополнил.

Цитата Сообщение от Gazzi Посмотреть сообщение
... Добавляете в импорт свою dll ...
Вот тут недопонял, поподробней можно...
Забудьте, не к чему тут перехваты.

Сделайте просто proxy-dll на языке который поддерживает оба соглашения. Пусть она импортирует cdecl-функции из dll (от которой у вас нет исходника, но есть прототипы), а экспортирует stdcall-функции (переходники к cdecl-функциям). Ну и используйте эту proxy-dll в VB.

Цитата Сообщение от Gazzi Посмотреть сообщение
В стране недостаток снега штоль ?
Чойто все дружно "пургу" взялись "нести".
Как спрашиваете, так вам и отвечают.
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
03.01.2018, 14:36  [ТС]
... proxy-dll на языке который поддерживает оба соглашения ...
Ну во первых: У меня нет в распоряжении такого языка

Во вторых:
С таким же успехом я могу со стороны вызывающей программы
накатать asm-вставку с "перетяжкой" RET-ов.
И посыпятся такие-же подобные вопросы:
А где мне взять адрес моей загруженной DLL, и тому подобное.
И опять, не получу ответа...

Какая разница, где ковырять, в DLL, proxy-dll или EXE.
Наткнусь на те же грабли.

Вот вместо proxy-dll, вставляю туда "proxy-вызовы"
(если их так можно "обозвать").

Не получил ответа на два конкретных вопроса, вот в чём засада.
Зато советов ...
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.01.2018, 15:24

Не по теме:

Ещё месяц-другой и будет ясна исходная причина возникновения темы.


Затрудняюсь с оценкой нижеследующих рассуждений, но предполагаю, что VB обязан работать с cdecl.

Не знаю VB, но сразу после прочтения задал поиск "поддержка vb соглашения cdecl" и ознакомился с темой на другом форуме (ссылку давать не могу - правила запрещают). Приведу цитату
Оказывается VB6 поддерживат вызов cdecl-функций
В общем, VB вполне официально заявляет возможность поддерживать cdecl-функции.

Убедиться можно в этом хотя бы засунув в свой проект такую строчку:
Visual Basic
1
Private Declare Sub Boombara CDecl Lib "foo.dll ()
Если вы попытаетесь вызвать такую функцию из проекта, то получите скорее ошибку «Bad DLL calling convention». И если вы нажмёте на кнопку Help в окошечке с этой ошибкой, то в хелпе по этой ошибке можно найти вполне официальное заявление:
MSDN98 об ошибке 49 писал(а):
Bad DLL calling convention (Error 49)
Arguments passed to adynamic-link library (DLL) must exactly match those expected by the routine. Calling conventions deal with number, type, and order of arguments. This error has the following causes and solutions:

- Your program is calling a routine in a DLL that's being passed the wrong type of arguments.
Make sure all argument types agree with those specified in the declaration of the routine you are calling.

- Your program is calling a routine in a DLL that's being passed the wrong number of arguments.
Make sure you are passing the same number of arguments indicated in the declaration of the routine you are calling.

- Your program is calling a routine in a DLL, but isn't using the StdCall calling convention.
If the DLL routine expects argumentsby value, then make sure ByVal is specified for those arguments in the declaration for the routine.

- Your Declare statement for a Windows DLL includes CDecl.
For additional information, select the item in question and press F1.
Обратите внимание на последний пункт. В общем, об этом на форуме писали ещё давно — в 2004 году. И для меня это тоже далеко не новость была. Как видно из того топика, поддержка вызова CDecl-функций открыта только для Macintosh-версий VB/VBA (главным образом для маковского Офиса).

И вот как раз сегодня упомянув в одном ICQ-шном разговоре эту фичу, меня вдруг осенило:
— А в TLB-то мы тоже можем указывать calling convention наших функций (и методов)

Ну и был поставлен эксперимент.
Предположение было награждено удачным результатом!
Соглашение cdecl — поддерживается, и вызовы к нему совершенно правильно компилируются!
Далее, там приводится пример успешного вызова wsprintf, но потом добавлено
Я уж было начал делать TLB-шку с объявлениями всех функций сишного рантайма (стандартной библиотеки Си), проживающих в NTDLL, таких как printf, scanf, isdigit, memcpy, strcpy, упомянутой в пресловутом топике qsort и им подобным. И тут такая досада — нельзя отлаживать (дело даже не доходит до вызова функций), ибо падает.
---------------------------------------------
Кроме этого, в теме
Работа с DLL в Visual Basic (статья)
нашёл
Цитата Сообщение от Craw Посмотреть сообщение
это всё описываются библиотеки с stdcall. А как же cdecl? Ну, в VB есть ключевое слово cDecl, причём использоваться оно должно так:
Visual Basic
1
Private Declare Function название_функции cDecl Lib "название_библиотеки"...
Однако вероятно вы получите Bad DLL Calling Convention (Error 49). Точнее, ваша программа будет работать лишь в Native (машинном) коде, т.е. уже полностью откомпилированная. А в режиме отладки (P-код), как и в самой IDE - нет. Дальнейшая разработка программы будет очень осложнена.
Мда, вот они какие - недокументированные возможности! Может есть шанс подключать cdecl библиотеки с динамическим подключением?
--------------------------------------------
Что скажите на это?
Может нужно искать решение в синтаксисе VB?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.01.2018, 15:24
Помогаю со студенческими работами здесь

Конфликт forward и stdcall в dll-библиотеке
Добрый день. Есть некая библиотека library S_dll; uses ...; {$R *.res} var ... function LInit:Integer; stdcall;

string в char* для вызова функции из dll
Для вызова функции из dll нужно передать 3 параметра в формате char* public static extern void Startmc(char*...

Можно ли из ASP как-то вызвать dll, чтобы результат её (dll) работы вставился в место вызова?
Можно ли из ASP как-то вызвать dll, чтобы результат её (dll) работы вставился в место вызова? Вызываемая dll - это ISAPI-приложение.

нужно чтобы функция располагалась до ее вызова, после ее вызова и в другом файле. Как это сделать?
#include <iostream> #include <conio.h> using namespace std; int n, *c; void fun(int a, int b) { for (int i = 0; i <...

Не понятно, как сделать аннотации для вызова
Пример : Есть класс Parent и два дочерних : Child1 и Child2 public class Parent { } public class Child1 extends Parent { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru