Russian Qt Forum

Qt => Вопросы новичков => Тема начата: nikeo от Октябрь 29, 2012, 18:08



Название: Макрос для того,чтобы не вылазило предупреждение
Отправлено: 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


Название: Re: Макрос для того,чтобы не вылазило предупреждение
Отправлено: mutineer от Октябрь 29, 2012, 18:11
Нужно не приписывать __stdcall__ к нефункциям


Название: Re: Макрос для того,чтобы не вылазило предупреждение
Отправлено: nikeo от Октябрь 29, 2012, 18:28
Нужно не приписывать __stdcall__ к нефункциям

Не понял не шутки.
Я выгружаю прочедуру из dll библиотеки.
Код:
typedef WCHAR (_stdcall *GETTITLE);
и вот на это он ругается...
Код:
typedef void  (_stdcall *LOCKDATA) (void* Data);
на это нет.


Название: Re: Макрос для того,чтобы не вылазило предупреждение
Отправлено: mutineer от Октябрь 29, 2012, 18:33
Добавь пустые скобки к объявлению указателя
Код:
typedef WCHAR (_stdcall *GETTITLE)();


Название: Re: Макрос для того,чтобы не вылазило предупреждение
Отправлено: nikeo от Октябрь 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


Название: Re: Макрос для того,чтобы не вылазило предупр
Отправлено: mutineer от Октябрь 29, 2012, 23:43
Без скобок у тебя был указатель не на функцию, а на данные. _stdcall лепить к такому указателю бесполезно

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

З.Ы. но возможно что ты не возвращаешь значение из функции


Название: Re: Макрос для того,чтобы не вылазило предупреждение
Отправлено: nikeo от Октябрь 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)();
    }
}