На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS

Дорогие друзья! Поздравляем вас с Новым 2026 годом!

Всем удачи, успеха и благополучия!

msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Как понимать предупреждение
    warning C4273: 'InstallWinIoDriver' : inconsistent dll linkage. dllexport assumed.
    ниже перевод( мой)
    непоследовательное{противоречивое} dll редактирование. dllexport принятый.
    Я получаю такое предупреждение при линковке и ,хотя программа собирается, но не делает того что я ожидаю.
    В поиске нашел ответ от ADIL
    При создании DLL должно быть dllexport, а не dllimport, о чем и сообщает компилятор:



    Но я не делаю dll она прилагается
    ExpandedWrap disabled
      #include <windows.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include "WinIo.h"
      bool _stdcall InstallWinIoDriver
       (
         PSTR pszWinIoDriverPath,      
         bool IsDemandLoaded          
       );                                
       
      void main()
      {
      InstallWinIoDriver("c:\\WinIo.sys",false);
      if(InstallWinIoDriver("c:\\WinIo.sys",false))
      printf("%s","Instal complecte");
       
      }



    ___________
    Сообщение отредактировано: oksman -
      В общем сообщение о кривой линковке (сборке, один и моих бывших преподов ВУЗа, прибил бы меня за слово "линковка" :) - лирическое отступление :) )
      А вообще мало информации для ответа, что собирается на каком компилере, с какими либами и т.д. ...
        Цитата BlackEmperor @
        В общем сообщение о кривой линковке (сборке, один и моих бывших преподов ВУЗа, прибил бы меня за слово "линковка" :) - лирическое отступление :) )
        А вообще мало информации для ответа, что собирается на каком компилере, с какими либами и т.д. ...

        Спасибо за ответ.
        Собирается вышеприведенная программа для инсталляции драйвера WinIo под XP.
        IDE Visual C++ 6.5. Линкуется с WinIo.lib. Все строго по инструкции, прилагаемой к программе.
        P.S Что плохого в слове линковка :)
        P.P.S Как можно узнать установился ли драйвер в систему?
        Сообщение отредактировано: oksman -
          Цитата BlackEmperor @
          При создании DLL должно быть dllexport

          При создании DLL?? А тип проекта какой? Вы DLL делаете или EXE?
            Цитата MinLexx @
            Цитата BlackEmperor @
            При создании DLL должно быть dllexport

            При создании DLL?? А тип проекта какой? Вы DLL делаете или EXE?

            EXE :o
              А _stdcall обязательно нужно? :huh:
              Что в WinIo.h?

              Цитата MSDN

              'function' : inconsistent DLL linkage
              Two definitions in a file differ in their use of dllimport.
              The following sample generates C4273:
              // C4273.cpp
              // compile with: /W1
              char __declspec(dllimport) c;
              char c; // C4273, delete this line or the line above to resolve

              int main()
              {
              }


              Два определения в файле отличаются друг от друга (один с dllimport, другой с dllexport например)

              Думается, проблема в WinIo.h, в котором объявлена InstallWinIoDriver как-то по-другому? :blink:
                А надо ли вообще объявлять прототип InstallWinIoDriver? В "WinIo.h" его разве нет?
                  Цитата Adil @
                  А надо ли вообще объявлять прототип InstallWinIoDriver? В "WinIo.h" его разве нет?

                  Adil Спасибо.
                  Проверю. Прототип объявил на автопилоте :)

                  Два определения в файле отличаются друг от друга (один с dllimport, другой с dllexport например)

                  Думается, проблема в WinIo.h, в котором объявлена InstallWinIoDriver как-то по-другому?

                  MinLexx Спасибо.Проверю. :)

                  P.S Как можно узнать установился ли драйвер в систему, кроме тестирования программы на железе?
                  Сообщение отредактировано: oksman -
                    Цитата Adil @
                    А надо ли вообще объявлять прототип InstallWinIoDriver? В "WinIo.h" его разве нет?

                    Adil Еще раз спасибо.
                    Предупреждений нет :)

                    Но при попытке исполнить простой тест
                    ExpandedWrap disabled
                      #include <windows.h>
                      #include <stdio.h>
                      #include <stdlib.h>
                      #include "WinIo.h"
                       
                       
                      DWORD *a;                        
                      void main()
                      {
                      InstallWinIoDriver("c:\\WinIo.sys",false);
                      if(InstallWinIoDriver("c:\\WinIo.sys",false))
                      printf("%s","Instal complecte");
                       
                       InitializeWinIo();
                      if(InitializeWinIo())
                      printf("%s","Init complecte");
                       
                       SetPortVal(278,15,1);                        
                       GetPortVal(278,a,1);
                      printf("%d",a);
                      }


                    получаю
                    Instal complecte
                    0
                    что свидетельствует ИМХО о том, что функция InitializeWinIo()
                    не завершилась успешно.Все делаю по инструкции к пакету WinIo.
                    Где я неправ? Может не вижу чего то очевидного.
                      Вообще, достаточно странный код. я бы убрал несколько строк...

                      ExpandedWrap disabled
                        void main()
                        {
                        // эту //InstallWinIoDriver("c:\\WinIo.sys",false);
                        if(InstallWinIoDriver("c:\\WinIo.sys",false))
                        printf("%s","Instal complecte");
                         
                        // и эту //InitializeWinIo();
                        if(InitializeWinIo())
                        printf("%s","Init complecte");
                         
                         SetPortVal(278,15,1);                        
                         GetPortVal(278,a,1);
                        printf("%d",a);
                        }


                      Добавлено
                      Цитата oksman @
                      GetPortVal(278,a,1);

                      Так делать нельзя, запись по неинициализированному указателю.

                      ExpandedWrap disabled
                        DWORD a;
                        GetPortVal(278,&a,1);
                        Цитата Uncle_Bob @
                        Так делать нельзя, запись по неинициализированному указателю.

                        ExpandedWrap disabled
                          DWORD a;
                          GetPortVal(278,&a,1);

                        Большое спасибо :)
                        Согласен,что по п1.код излишний,по п2 явная ошибка.
                        Но проблема то в том, что
                        ExpandedWrap disabled
                          if(InstallWinIoDriver("c:\\WinIo.sys",false))
                          printf("%s","Instal complecte");

                        исполняется( и в реестре прописана и winio.sys в папке драйверов есть)
                        а функция
                        ExpandedWrap disabled
                          if(InitializeWinIo())
                          printf("%s","Init complecte");

                        в 6 студии не исполняется вообще т.е.
                        Init complecte я не вижу.
                        При компиляции в 7.1 студия не дает мне увидеть, что произошло(мелькнул экран и все)
                        Но порт не реагирует :o
                        Как в 7.1 студии увидеть результат?( поставил только два дня как, еще осваиваюсь :o )
                        Кстати , столкнулся с непонятным явлением.
                        В 98 по ,старту системы, порт 0x278 встает в 8( я потом его сам обнуляю либо этот бит не подключаю)
                        а в XP по старту встает в 255 :ну и не управляется пока у меня никак :o
                        MinLexx
                        Спасибо за цитату MSDN .Перевел.
                        Русским языком сказано " Двойное определение функции - удалите эту строку" :)
                        Сообщение отредактировано: oksman -
                          Цитата oksman @
                          в 6 студии не исполняется вообще

                          Видимо, все-таки исполняется, но возвращает false ;)

                          Остается продиагностировать проблему. Есть какой-нибудь вызов для получения кода ошибки? Я с WinIo не знаком.
                            Цитата Uncle_Bob @
                            Цитата oksman @
                            в 6 студии не исполняется вообще

                            Видимо, все-таки исполняется, но возвращает false ;)

                            Остается продиагностировать проблему. Есть какой-нибудь вызов для получения кода ошибки? Я с WinIo не знаком.

                            Согласен.Неточно выразился. :)
                            К сожалению кодов ошибок в WinIo нет.
                            Единственное, что нашел в хелпе (перевод мой)
                            ExpandedWrap disabled
                              InitializeWinIo
                              Эта функция инициализирует WinIo библиотеку.
                              bool _stdcall InitializeWinIo();
                              Параметры:
                              Нет
                              Возвращаемые значения:
                               При нормальном завершении, функция возвращает true. Иначе возвращает false.
                              Замечания:
                              Функцию InitializeWinIo следует вызывать перед использованием любой другой функции  библиотеки.
                               
                              Обратите внимание:
                              • Нет необходимости  вызывать функцию InitializeWinIo перед вызовом функций InstallWinIoDriver  и  RemoveWinIoDriver.
                              • Под Windows NT / 2000/xp, вызванная InitializeWinIo предоставляет приложению полный доступ к адресному пространству ввода - вывода. После вызова функции, приложение может свободно использовать функции _inp/_outp, обеспеченные C библиотекой во время выполнения, чтобы обращаться к портам ввода - вывода  системы.


                            Что еще выяснил:
                            С пакетом идет пример
                            ExpandedWrap disabled
                              void main()
                              {
                                DWORD dwPortVal;
                                DWORD dwMemVal;
                                bool bResult;
                                HANDLE hPhysicalMemory;
                                PBYTE pbLinAddr;
                               
                                // Call InitializeWinIo to initialize the WinIo library.
                               
                                bResult = InitializeWinIo();
                               
                                if (bResult)
                                {
                                  // Under Windows NT/2000/XP, after calling InitializeWinIo,
                                  // you can call _inp/_outp instead of using GetPortVal/SetPortVal
                                printf(" Initialization  WinIo.\n");// Это я добавил для контроля
                                  GetPortVal(0x378, &dwPortVal, 4);
                               
                                  SetPortVal(0x378, 10, 4);
                               
                                    // When you're done using WinIo, call ShutdownWinIo
                               
                                  ShutdownWinIo();
                                }
                                else
                                {
                                  printf("Error during initialization of WinIo.\n");
                                  exit(1);
                                }
                              }

                            Так он исполняется 1-2 раза из 20 :o
                            Ничего не могу понять :(
                            P.S.А как в 7 студии посмотреть результать исполнения?. Экран мелькнул и все.
                            P.P.S. Ничего не делал,ничего не менял, вдруг заработала :D
                            Извини за напряг
                            Сообщение отредактировано: oksman -
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0540 ]   [ 16 queries used ]   [ Generated: 20.01.26, 04:45 GMT ]