
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.92.87] |
![]() |
|
![]() |
|
|
Господа, помогите, пожалуйста, избавиться от Run-time error 49 (Bad DLL calling convention). Ситуация такая.
У меня есть MFC DLL, которую я сделал на MSVC++ v7. В ней функция ![]() ![]() __declspec(dllexport) void mfcfun(int n) {...} ![]() ![]() Private Declare Sub mfcfun _ Lib "C:\work\access\mfcdll.dll" _ Alias "?mfcfun@@YAXH@Z" _ (ByVal n As Integer) Private Sub testDLL() mfcfun 33 End Sub Конечно, можно поставить On Error Resume Next но только боюсь, это приведёт рано или поздно к каким-нибудь проблемам. Что посоветуете? PS на CodeNet.ru никто не знает, похоже... |
Сообщ.
#2
,
|
|
|
Попробуй убрать
![]() ![]() ByVal Добавлено Цитата Bad DLL Calling Convention Error This error is often caused by incorrectly omitting or including the ByVal keyword from the Declare statement. This error can also be caused if the wrong parameters are passed. |
Сообщ.
#3
,
|
|
|
Цитата Mr. Greg @ Нельзя. Тогда должно будет статьПопробуй убрать ByVal mfcfun(int* n), а мне надо без "*"... |
Сообщ.
#4
,
|
|
|
Скинь длл
|
Сообщ.
#5
,
|
|
|
Вот rar.
В нём проект на VC++ v7.0. В папках Debug\ и Release\ соответственно отладочная и релизная DLL. Обе ведут себя одинаково. Функция вызывается, параметр передаётся правильно, но потом ошибка 49... Моя реальная DLL делает, конечно, гораздо больше всего интересного, но эта тестовая ведёт себя так же. Прикреплённый файл ![]() |
Сообщ.
#6
,
|
|
|
Цитата The C++ project must also be set to use the __stdcall calling convention. Otherwise you will get error 49 "Bad DLL Calling Convention". The issue there is that C++ and VB natively push arguments on the stack in different manner. But when you tell Visual C++ (presumable could do the same w/ Borland or another compiler) to use the __stdcall convention it makes it so your VB program can read it. ![]() ![]() __stdcall надо использовать, тем более если тип данных не определен ![]() ![]() void зы. проект перекомпиленный в vc 6 ведет себя также ![]() Добавлено VC DLL in VB |
Сообщ.
#7
,
|
|
|
попробуй вместо void поюзать инт.. ноль возвратишь и ладно.. басике инт на лонг надо менять...
|
![]() |
|
|
Спасибо, Mr. Greg. Надо действительно писать __stdcall (или PASCAL):
![]() ![]() __declspec(dllexport) void __stdcall mfcfun(int n) {...} |
![]() |
Сообщ.
#9
,
|
|
M Тема перемещена из раздела VB for Application |
Сообщ.
#10
,
|
|
|
Цитата Old Bat @ Вам, конечно, виднее, уважаемый Old Bat, но мне почему-то кажется, что вопрос "как вызвать функцию из DLL в программе, написанной на VBA?" всё-таки относится именно к VBA, у не к каким-то там "общим вопросам"... Тема перемещена из раздела VB for Application |
![]() |
Сообщ.
#11
,
|
|
IMHO
![]() |
Сообщ.
#12
,
|
|
|
Да, вы правы.
|
Сообщ.
#13
,
|
|
|
Private Declare Sub mfcfun _
Lib "C:\work\access\mfcdll.dll" _ Alias "?mfcfun@@YAXH@Z" _ (ByVal n As LONG) и все ок будет |
Сообщ.
#14
,
|
|
|
Используй def-файл, чтобы убрать декорирование имен.
Тогда будет не "?mfcfun@@YAXH@Z", а "mfcfun" Достаточно в этом файле прописать EXPORT: mfcfun |
Сообщ.
#15
,
|
|
|
Цитата nash @ и все ок будет утверждение ложное, не проверил, а советуешь ![]() Цитата Алиса @ убрать декорирование имен однако, полезно предыдущие ответы посмотреть - в ссылке об этом есть. |
Сообщ.
#16
,
|
|
|
Цитата утверждение ложное, не проверил, а советуешь что проверять когда C-ый int - это VB-ый Long. Уже здесь ошибка. Может еще в чем. Кстати, это ты советуешь во втором посте передавать по ссылке, когда сразу видно, что там по значению ![]() |