На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Visual C++ и Borland C++ Builder , использование функции Visual C++ в Borland C++ Bui
    Привет всем

    такой вопрос
    я к программе, написанной в Borland C++ Builder подключаю библиотеку, написанную на Visual C++

    ExpandedWrap disabled
          HINSTANCE hModule=NULL;
          typedef  BOOL (WINAPI w);
          w* w1=NULL;
          hModule=LoadLibrary("S.dll");
          if (hModule!=NULL)
          {
                      w1=(w*)GetProcAddress(hModule,"?S_Rec@@YAXPAD@Z");
                      if (w1!=NULL)
                      {
                        char SOut [256];
                        S_Rec(SOut);
       
                      }
                      else
                      {
                      ShowMessage("error load S_Rec");
                      }
       
              ::FreeLibrary(hModule);
          }
          else
              {
                  ShowMessage("error load S.dll");
              }


    изначально функция имеет вид
    ExpandedWrap disabled
      S_Rec(char *pRecResult);


    при конвертировании она изменяется на
    ExpandedWrap disabled
      ?S_Rec@@YAXPAD@Z


    Как мне к ней обращаться?

    S.def
    ExpandedWrap disabled
      LIBRARY     S.DLL
       
      EXPORTS
          ?S_Init@@YAXXZ            @1   ; ?S_Init@@YAXXZ
          ?S_Rec@@YAXPAD@Z          @2   ; ?SIRIUS_Rec@@YAXPAD@Z
          ?S_Testing@@YAXXZ         @3   ; ?S_Testing@@YAXXZ
      У меня дежавю? :
      Цитата preya @
      ExpandedWrap disabled
        LIBRARY     S.DLL
         
        EXPORTS
            ?S_Init@@YAXXZ            @1   ; ?S_Init@@YAXXZ
            ?S_Rec@@YAXPAD@Z          @2   ; ?S_Rec@@YAXPAD@Z
            ?S_Testing@@YAXXZ         @3   ; ?S_Testing@@YAXXZ



      Добавлено 6.09.06, 11:19
      еще вопрос
      как осуществить явный вызов функций DLL?
      можно пример

      где-то видела
      а сейчас не могу найти

      Цитата preya @
      использую явный вызов функций
      все работает
      ExpandedWrap disabled
           HINSTANCE hModule=NULL;
           typedef  bool (WINAPI w);
           w* w1=NULL;
                 w* w2=NULL;
           hModule=LoadLibrary("S.dll");
           if (hModule!=NULL)
           {
                        w1=(w*)GetProcAddress(hModule,"?S_Init@@YAXXZ");
                        w2=(w*)GetProcAddress(hModule,"?S_Testing@@YAXXZ");
                        if (w1==NULL)
                        {
                        ShowMessage("error load function S_Init");
                        }
                        if (w2==NULL)
                        {
                        ShowMessage("error load function S_Testing");
                        }
         
              ::FreeLibrary(hModule);
           }
           else
                {
                    ShowMessage("error load library SIRIUS.dll");
                }

      тема закрыта
      ВСЕМ ОГРОМНОЕ СПАСИБО!!!

      Это цитаты из ошибка при подключении *.lib файла, Linker Error
        было ;)
        библиотеку подключила
        работает

        а вот как к этой функции обращаться?

        или надо было в той же теме вопрос задать?
          Цитата preya @
          изначально функция имеет вид
          Что это за странный вид такой? А где тип возвращаемого значения? Да и соглашение о передаче параметров лучше указывать явно.
            ExpandedWrap disabled
              void S_Rec(char *pRecResult);
              Цитата preya @
              а вот как к этой функции обращаться?
              Ты же получила адрес функции, присвоила его переменной типа "указатель на функцию". Теперь вызывай функцию, используя этот указатель.
                но функция в борланде выглядит так
                ExpandedWrap disabled
                  ?S_Rec@@YAXPAD@Z

                при ее вызове выдается ошибка
                Expression syntax

                а при вызове
                ExpandedWrap disabled
                  char SOut [256];
                  S_Rec(SOut);

                выдается ошибка
                [Linker Error] Unresolved external 'S_Rec(char *)' referenced from D:\AC\FORM.OBJ

                как мне ее вызывать???
                  Я не понял. А к чему тогда шаманство с LoadLibrary/GetProcAddress ?
                    ExpandedWrap disabled
                                    w1=(w*)GetProcAddress(hModule,"?S_Rec@@YAXPAD@Z");
                                      if (w1!=NULL)
                                      {
                                        char SOut [256];
                                        //S_Rec(SOut); - O, main God!
                                        w1(SOut);
                       
                                      }
                      ой
                      поняла ;)

                      тогда ошибка
                      [C++ Error] Form.cpp(143): E2314 Call of nonfunction
                      я неправильно w1 объявляю?
                        preya Научись пользоватся def файлами.
                          как???

                          Добавлено
                          что я не так делаю?
                            preya, объяви тип указатель на функцию, потом сам указатель и вызывай!

                            ExpandedWrap disabled
                              typedef  void (*SREC)(char*); //тип
                              SREC S_Rec; //указатель
                               
                              S_Rec = (SREC)GetProcAddress(hModule, ","?S_Rec@@YAXPAD@Z");
                               
                              if (S_Rec != NULL)
                              {
                                char SOut[256]="hello";
                                S_Rec(SOut);
                              }
                              ура
                              получилось!!!
                              ОГРОМНОЕ СПАСИБО!!!

                              ExpandedWrap disabled
                                    HINSTANCE hModule=NULL;
                                    typedef  BOOL (WINAPI *SREC)(char*);
                                        SREC S_Rec=NULL;
                                    hModule=LoadLibrary("S.dll");
                                    if (hModule!=NULL)
                                    {
                                                S_Rec=(SREC)GetProcAddress(hModule,"?S_Rec@@YAXPAD@Z");
                                                if (S_Rec!=NULL)
                                                {
                                                  char SOut[256];
                                                  S_Rec(SOut);
                                                }
                                                else
                                                {
                                                ShowMessage("error load function S_Rec");
                                                }
                                 
                                        ::FreeLibrary(hModule);
                                    }
                                    else
                                        {
                                            ShowMessage("error load library S.dll");
                                        }
                                Цитата preya @
                                как???

                                http://search.msdn.microsoft.com/search/Redirect.aspx?title=Module-Definition+(.def)+Files+&url=http://msdn2.microsoft.com/en-us/library/28d6s79h.aspx

                                вот так. Читай про секцию EXPORTS.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0390 ]   [ 15 queries used ]   [ Generated: 19.05.24, 23:06 GMT ]