На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Bad DLL calling convention , вызов функции из vba
    Господа, помогите, пожалуйста, избавиться от Run-time error 49 (Bad DLL calling convention). Ситуация такая.

    У меня есть MFC DLL, которую я сделал на MSVC++ v7. В ней функция
    ExpandedWrap disabled
      __declspec(dllexport) void mfcfun(int n) {...}
    Я её вызываю из MS Access следующим кодом
    ExpandedWrap disabled
      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
    Она нормально вызывается, но выдаёт после выхода эту самую ошибку 49.

    Конечно, можно поставить
    On Error Resume Next
    но только боюсь, это приведёт рано или поздно к каким-нибудь проблемам.

    Что посоветуете?

    PS на CodeNet.ru никто не знает, похоже...
      Попробуй убрать
      ExpandedWrap disabled
        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.
        Цитата Mr. Greg @
        Попробуй убрать ByVal
        Нельзя. Тогда должно будет стать
        mfcfun(int* n), а мне надо без "*"...
          Скинь длл
            Вот rar.

            В нём проект на VC++ v7.0.

            В папках Debug\ и Release\ соответственно отладочная и релизная DLL. Обе ведут себя одинаково. Функция вызывается, параметр передаётся правильно, но потом ошибка 49...

            Моя реальная DLL делает, конечно, гораздо больше всего интересного, но эта тестовая ведёт себя так же.
            Прикреплённый файлПрикреплённый файлmfcdll.rar (31.26 Кбайт, скачиваний: 128)
              Цитата
              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.
              ExpandedWrap disabled
                __stdcall

              надо использовать, тем более если тип данных не определен
              ExpandedWrap disabled
                void
              , с VB так нельзя.
              зы. проект перекомпиленный в vc 6 ведет себя также :(

              Добавлено
              VC DLL in VB
              Сообщение отредактировано: Mr. Greg -
                попробуй вместо void поюзать инт.. ноль возвратишь и ладно.. басике инт на лонг надо менять...
                  Спасибо, Mr. Greg. Надо действительно писать __stdcall (или PASCAL):
                  ExpandedWrap disabled
                    __declspec(dllexport) void __stdcall mfcfun(int n) {...}
                    M
                    Тема перемещена из раздела VB for Application
                      Цитата Old Bat @
                      Тема перемещена из раздела VB for Application
                      Вам, конечно, виднее, уважаемый Old Bat, но мне почему-то кажется, что вопрос "как вызвать функцию из DLL в программе, написанной на VBA?" всё-таки относится именно к VBA, у не к каким-то там "общим вопросам"...
                        IMHO :no: к VB, и, в том числе, к VBA. В теме не рассматриваются особенности именно VBA-кода (см. пост #6)
                          Да, вы правы.
                            Private Declare Sub mfcfun _
                            Lib "C:\work\access\mfcdll.dll" _
                            Alias "?mfcfun@@YAXH@Z" _
                            (ByVal n As LONG)

                            и все ок будет
                              Используй def-файл, чтобы убрать декорирование имен.
                              Тогда будет не "?mfcfun@@YAXH@Z", а "mfcfun"
                              Достаточно в этом файле прописать
                              EXPORT:
                              mfcfun
                                Цитата nash @
                                и все ок будет

                                утверждение ложное, не проверил, а советуешь :angry:
                                Цитата Алиса @
                                убрать декорирование имен

                                однако, полезно предыдущие ответы посмотреть - в ссылке об этом есть.
                                Сообщение отредактировано: Mr. Greg -
                                  Цитата
                                  утверждение ложное, не проверил, а советуешь

                                  что проверять когда C-ый int - это VB-ый Long.
                                  Уже здесь ошибка. Может еще в чем.
                                  Кстати, это ты советуешь во втором посте передавать по ссылке, когда сразу видно, что там по значению :D
                                  Сообщение отредактировано: nash -
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0466 ]   [ 16 queries used ]   [ Generated: 20.09.24, 11:25 GMT ]