#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;
}
Работа с функциями WinAPI из классов C++
Код:
При линковке вылетают ошибки:
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;
Код:
#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;
}
#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'ом? Короче, прошу знающих людей помощь разобраться в этом столь непростом для меня вопросе.
Удаление строки с объявлением переменной приводит к оптимизации кода, а следовательно классы попросту не компилируются :)
К WinAPI это отношения не имеет
Код:
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;}
};
{
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;}
};
Код:
#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;
}
#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;
}