Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с функциями WinAPI из классов C++

36K
30 августа 2008 года
vagiz
14 / / 30.08.2008
Имеется код:
Код:
#include <iostream>
#include <string>
#include <stdio.h>
#include <windows.h>
struct TFileSize
{
    unsigned int low_part;
    unsigned int high_part;
    unsigned __int64 size;
};
class TFile
{
protected:
    LPCWSTR name;
    TFileSize size;
    char* content;
    virtual void CalculateSize();
    virtual void FillContent();
public:
    void SetFileName(LPCWSTR filename)
    {
        name=filename;
    }
    LPCWSTR GetFileName()
    {
        return name;
    }
    unsigned __int64 GetSize()
    {
        return size.size;
    }
    virtual void Open();
    virtual void Close();
    virtual void Read();
    virtual void Write();
    virtual void Copy(TFile to);
    virtual void Create();
};
class TWinAPIFile:public TFile
{
protected:
    HANDLE file;
    virtual void CalculateSize()
    {
        if(file!=INVALID_HANDLE_VALUE)
        {
            __int64 low_part=0;
            __int64 high_part=0;
            low_part=GetFileSize(file, (LPDWORD)high_part);
            size.low_part=low_part;
            size.high_part=high_part;
            size.size=(high_part<<32)|low_part;
        }
    }
    virtual void FillContent()
    {
        content=new char[size.size];
        __int64 bytes_read=0;
        ReadFile(file, content, sizeof(*content), (LPDWORD)bytes_read, NULL);
    }
public:
    virtual void Open()
    {
        file=CreateFile(name, GENERIC_WRITE|GENERIC_READ, 0, 0, 3, 0, 0);
        CalculateSize();
        FillContent();
    }
    virtual void Close()
    {
        CloseHandle(file);
        delete[] content;
    }
};

int main()
{
    TWinAPIFile f;
    return 0;
}

При линковке вылетают ошибки:
1>Linking...
1>main_code.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall TFile::Read(void)" (?Read@TFile@@UAEXXZ)
1>main_code.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall TFile::Write(void)" (?Write@TFile@@UAEXXZ)
1>main_code.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall TFile::Copy(class TFile)" (?Copy@TFile@@UAEXV1@@Z)
1>main_code.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall TFile::Create(void)" (?Create@TFile@@UAEXXZ)
1>main_code.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall TFile::CalculateSize(void)" (?CalculateSize@TFile@@MAEXXZ)
1>main_code.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall TFile::FillContent(void)" (?FillContent@TFile@@MAEXXZ)
1>main_code.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall TFile::Open(void)" (?Open@TFile@@UAEXXZ)
1>main_code.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall TFile::Close(void)" (?Close@TFile@@UAEXXZ)
Однако если закомментировать строку
 
Код:
TWinAPIFile f;
то тогда всё проходит без проблем. Мне кажется, что существуют какие-то фундаментальные противоречие, препятствующие нормальной работе с апишными функциями из c++'ных классов. Я решил проверить эту гипотезу и набросал следующий код:
Код:
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <string>
class TMessage
{
protected:
    LPCTSTR caption;
    LPCTSTR text;
public:
    virtual void SetCaption(LPCTSTR str)
    {
        caption=str;
    }
    virtual void SetText(LPCTSTR str)
    {
        text=str;
    }
    virtual void Show()
    {
        MessageBox(NULL, text, caption, MB_OK);
    }
};
class TUserMessage:public TMessage
{
public:
    virtual void SetCaption()
    {
        std::string str;
        std::cout<<"Enter the caption...\n";
        std::cin>>str;
        caption=(LPCTSTR)&str.c_str();
    }
    virtual void SetText()
    {
        std::string str;
        std::cout<<"Enter the text...\n";
        std::cin>>str;
        text=(LPCTSTR)&str.c_str();
    }
};
int main()
{
    TMessage m;
    m.SetCaption(TEXT("simple caption"));
    m.SetText(TEXT("Вагиз"));
    m.Show();
    getchar();
    TUserMessage um;
    um.SetCaption();
    um.SetText();
    um.Show();
    //getchar();
   
    return 0;
}

Всё нормально работает, MessageBox'ы показываются как надо, то есть з объектов классоа С++ нормально без проблем вызываются методы WinAPI. Но почему тогда возникают проблемы в первом примере? Я слышал где-то, что надо какие-то функции объявлять как static, но почему без этого удалось обойтись в примере работы с MessageBox'ом? Короче, прошу знающих людей помощь разобраться в этом столь непростом для меня вопросе.
1.9K
30 августа 2008 года
max_dark
256 / / 11.11.2005
Проблема в том, что в классе TFile нет реализации функций Open, Close и других выписаных в выводе компилятора
Удаление строки с объявлением переменной приводит к оптимизации кода, а следовательно классы попросту не компилируются :)
К WinAPI это отношения не имеет
36K
07 сентября 2008 года
vagiz
14 / / 30.08.2008
Допустим, я добавил реалзацию этих методов, но программа все равно не собирается. По-моему, с точки зрения синтаксиса в исходнике теперь всё верно, теперь совсем уж непонятно, что нужно сделать, чтобы собралось. Методы, которые не были определены, я решил определить в виде заглушек, ничего не делающих, но всё равно ошибки при линковке.
Код:
class TWinAPIFile:public TFile
{
protected:
    HANDLE file;
    virtual void CalculateSize()
    {
        if(file!=INVALID_HANDLE_VALUE)
        {
            __int64 low_part=0;
            __int64 high_part=0;
            low_part=GetFileSize(file, (LPDWORD)high_part);
            size.low_part=low_part;
            size.high_part=high_part;
            size.size=(high_part<<32)|low_part;
        }
    }
    virtual void FillContent()
    {
        content=new char[size.size];
        __int64 bytes_read=0;
        ReadFile(file, content, sizeof(*content), (LPDWORD)bytes_read, NULL);
    }
public:
    virtual void Open()
    {
        file=CreateFile(name, GENERIC_WRITE|GENERIC_READ, 0, 0, 3, 0, 0);
        CalculateSize();
        FillContent();
    }
    virtual void Close()
    {
        CloseHandle(file);
        delete[] content;
    }
    virtual void Read(){int* a=new int;delete a;}
    virtual void Write(){int* a=new int;delete a;}
    virtual void Copy(TFile to){int* a=new int;delete a;}
    virtual void Create(){int* a=new int;delete a;}
};
1.9K
07 сентября 2008 года
max_dark
256 / / 11.11.2005
Код:
#include <iostream>
#include <string>
#include <stdio.h>
#include <windows.h>
struct TFileSize
{
    unsigned int low_part;
    unsigned int high_part;
    unsigned __int64 size;
};
class TFile
{
protected:
    LPSTR name;
    TFileSize size;
    TCHAR* content;
    virtual void CalculateSize(){}
    virtual void FillContent() {}
public:
    void SetFileName(LPSTR filename)
    {
        name=filename;
    }
    LPCSTR GetFileName()
    {
        return name;
    }
    unsigned __int64 GetSize()
    {
        return size.size;
    }
    virtual void Open(){}
    virtual void Close(){}
    virtual void Read(){}
    virtual void Write(){}
    virtual void Copy(TFile to){}
    virtual void Create(){}
};
class TWinAPIFile:public TFile {
protected:
    HANDLE file;
    virtual void CalculateSize()
    {
        if(file!=INVALID_HANDLE_VALUE)
        {
            __int64 low_part=0;
            __int64 high_part=0;
            low_part=GetFileSize(file, (LPDWORD)high_part);
            size.low_part=low_part;
            size.high_part=high_part;
            size.size=(high_part<<32)|low_part;
        }
    }
    virtual void FillContent()
    {
        content=new char[size.size];
        __int64 bytes_read=0;
        ReadFile(file, content, sizeof(*content), (LPDWORD)bytes_read, NULL);
    }
public:
    void Open()
    {
        file=CreateFile(name, GENERIC_WRITE|GENERIC_READ, 0, 0, 3, 0, 0);
        CalculateSize();
        FillContent();
    }
    void Close()
    {
        CloseHandle(file);
        delete[] content;
    }
    void Read(){}
    void Write(){}
    void Copy(TFile to){}
    void Create(){}
};

int main() {
    TWinAPIFile f;
    return 0;
}
Собирается без ошибок
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог