전에 올린 코드엔 논리적 오류가 있어서 다시 올립니다.
typedef struct
{
HWND hWnd;
int Left;
int Top;
} MAPDATA, *LPMAPDATA;
class TGlobalMap : public TObject
{
public:
virtual __fastcall TGlobalMap();
virtual __fastcall ~TGlobalMap();
void __fastcall AcquireGlobalMap(TForm *MainForm);
private:
static const TCHAR* const _ID;
HANDLE _hMap;
LPMAPDATA _pMapData;
TForm *_MainForm;
void __fastcall CreateGlobalMap();
};
const TCHAR* const TGlobalMap::_ID = L"Global/Application/MyMap";
__fastcall TGlobalMap::TGlobalMap()
{
_hMap = NULL;
_pMapData = NULL;
_MainForm = NULL;
}
__fastcall TGlobalMap::~TGlobalMap()
{
UnmapViewOfFile( _pMapData );
CloseHandle(_hMap);
}
void __fastcall TGlobalMap::AcquireGlobalMap(TForm *MainForm)
{
_MainForm = MainForm;
HANDLE hMap = OpenFileMappingW(FILE_MAP_ALL_ACCESS, false, _ID);
LPMAPDATA pMap;
if( hMap )
{
pMap = (LPMAPDATA)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(MAPDATA));
CloseHandle(hMap);
if( !pMap ) {
throw Exception("Fail - MapViewOfFile()");
}
PostMessage(pMap->hWnd, WM_QUIT, 0, 0);
_MainForm->Left = pMap->Left;
_MainForm->Top = pMap->Top;
UnmapViewOfFile(pMap);
CreateGlobalMap();
return;
}
CreateGlobalMap();
}
void __fastcall TGlobalMap::CreateGlobalMap()
{
_hMap = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(MAPDATA), _ID);
if( !_hMap ) {
throw Exception(L"Fail - CreateFileMapping()");
}
_pMapData = (LPMAPDATA)MapViewOfFile(_hMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(MAPDATA) );
if( !_pMapData ) {
throw Exception(L"Fail - MapViewOfFile()");;
}
_pMapData->hWnd = _MainForm->Handle;
_pMapData->Left = _MainForm->Left;
_pMapData->Top = _MainForm->Top;
}
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
TGlobalMap *Map;
try
{
try
{
Map = new TGlobalMap();
Application->Initialize();
Application->MainFormOnTaskBar = true;
Application->CreateForm(__classid(TForm1), &Form1);
Map->AcquireGlobalMap(Application->MainForm);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
}
__finally
{
delete Map;
}
return 0;
}
|