Russian Qt Forum
Май 15, 2024, 21:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Макрос для того,чтобы не вылазило предупреждение  (Прочитано 2858 раз)
nikeo
Гость
« : Октябрь 29, 2012, 18:08 »

Какой макрос нужно написать,чтоы не вылазило предупреждение:
Код:
C:\Documents and Settings\nikeo\execTest-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_______\..\execTest\cexp.h:8: предупреждение: '__stdcall__' attribute only applies to function types
Записан
mutineer
Гость
« Ответ #1 : Октябрь 29, 2012, 18:11 »

Нужно не приписывать __stdcall__ к нефункциям
Записан
nikeo
Гость
« Ответ #2 : Октябрь 29, 2012, 18:28 »

Нужно не приписывать __stdcall__ к нефункциям

Не понял не шутки.
Я выгружаю прочедуру из dll библиотеки.
Код:
typedef WCHAR (_stdcall *GETTITLE);
и вот на это он ругается...
Код:
typedef void  (_stdcall *LOCKDATA) (void* Data);
на это нет.
Записан
mutineer
Гость
« Ответ #3 : Октябрь 29, 2012, 18:33 »

Добавь пустые скобки к объявлению указателя
Код:
typedef WCHAR (_stdcall *GETTITLE)();
Записан
nikeo
Гость
« Ответ #4 : Октябрь 29, 2012, 20:54 »

Добавь пустые скобки к объявлению указателя
Код:
typedef WCHAR (_stdcall *GETTITLE)();

теперь ругается на все остальные
Код:
C:\Documents and Settings\nikeo\execTest-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_______\..\execTest\cexp.h:145: предупреждение: control reaches end of non-void function
Записан
mutineer
Гость
« Ответ #5 : Октябрь 29, 2012, 23:43 »

Без скобок у тебя был указатель не на функцию, а на данные. _stdcall лепить к такому указателю бесполезно

Если ты хочешь гадания, то прорицатели на другом сайте. Покажи хоть что у тебя в строке, на которую ругается. Хотя в идеале лучше весь код

З.Ы. но возможно что ты не возвращаешь значение из функции
Записан
nikeo
Гость
« Ответ #6 : Октябрь 30, 2012, 11:32 »

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

Код:
typedef void   (_stdcall *CheckDM)();
typedef bool   (_stdcall *Initialize)   (WCHAR* );
typedef void   (_stdcall *PostCommand)  (WCHAR* );
typedef int    (_stdcall *Command)      (WCHAR* );
typedef int    (_stdcall *CommandEx)    (WCHAR* ,WCHAR* );
typedef bool   (_stdcall *RunModule)    (int* );
typedef bool   (_stdcall *RunEvent)     (int* );
typedef void   (_stdcall *SetAsString)  (int* ,WCHAR* );
typedef void   (_stdcall *GetAsString)  (int* ,WCHAR* );
typedef void   (_stdcall *SetAsInteger) (int* ,int* );
typedef int    (_stdcall *GetAsInteger) (int* );
typedef void   (_stdcall *SetAsFloat)   (int* ,double* );
typedef double (_stdcall *GetAsFloat)   (int* );
typedef void   (_stdcall *SetAsBoolean)  (int* ,bool* );
typedef bool   (_stdcall *GetAsBoolean)  (int* );
typedef void   (_stdcall *SetMatrix)    (int* ,int* ,int* ,int* );
typedef double (_stdcall *GetMatrix)    (int* ,int* ,int* );
typedef void   (_stdcall *ItemName)     (int* ,WCHAR* );
typedef int    (_stdcall *ItemOwner)    (int* );

class DMClient
{
private:

    HINSTANCE hDMClientDll;

protected:
//Constructor:

    DMClient():_refCount(0)
        {hDMClientDll = ::LoadLibraryW(L"DMClient.dll");
                  ++_refCount;}

//Destructor:

        virtual ~DMClient(){FreeLibrary(hDMClientDll);}

//Static pointer:

                static DMClient* _self;
                int _refCount;


public:
//Singleton Constructor:

         static DMClient* Instance()
           {

            if(!_self)
            {
             _self = new DMClient();
            }
             return _self;
            }

//Counting pointer
          void DeleteInstance()
           {
            if(--_refCount==0)
             {
              delete this;
              _self = 0;
             }

            }

//Prototype methods:

    void CheckDM_pl();
    bool Initialize_fl (WCHAR* adress);
    void PostCommand_pl (WCHAR* command);
    int  Command_fl (WCHAR* command);
    int  CommandEx_fl (WCHAR* command,WCHAR* aResBuff);
    bool RunModule_fl (int* moduleID);
    bool RunEvent_fl (int* eventID);
    void SetAsString_pl (int* fieldID,WCHAR* value);
    void GetAsString_pl (int* fieldID,WCHAR* buffer);
    void SetAsInteger_pl (int* fieldID,int* value);
    int GetAsInteger_fl (int* fieldID);
    void SetAsFloat_pl (int* fieldID,double* value);
    double GetAsFloat_fl (int* fieldID);
    void SetAsBoolean_pl (int* fieldID,bool* value);
    bool GetAsBoolean_fl (int* fieldID);
    void SetMatrix_pl (int* fieldID,int* row,int* col,int* value);
    double GetMatrix_pl (int* fieldID,int* row,int* col);
    void ItemName_pl (int* itemID, WCHAR* buffer);
    int ItemOwner_fl (int* itemID);

};

DMClient* DMClient::_self = 0;



ну и пример загрузки функции.

Код:
bool DMClient::Initialize_fl(WCHAR *adress)
{
    Initialize initialize;
    bool res;
      if (hDMClientDll!=NULL){
          initialize=(Initialize)GetProcAddress(hDMClientDll,"Initialize");
          res = (*initialize)(adress);
      }
      return res;
}

Еще смущает,что в библиотеке,созданной на делфи,есть процедуры,и вызов их,вероятно я делаю не верный :

Код:
void DMClient::CheckDM_pl()
{
    if (hDMClientDll!=NULL){
        CheckDM checkDM;
        checkDM=(CheckDM)GetProcAddress(hDMClientDll,"CheckDM");
        (*checkDM)();
    }
}

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.058 секунд. Запросов: 21.