if (OneCopyProgram(AnsiString(ExtractFileName(Application->ExeName)).c_str())) {
}
else {
exit(0);
}
Вторая копия программы
Влючаю в текст программы код:
Код:
в событии: FormCreate
и саму функцию:
Код:
bool __fastcall OneCopyProgram(LPSTR szName)
{
HANDLE hMutex = CreateMutex (NULL, TRUE, szName);
if (GetLastError() == ERROR_ALREADY_EXISTS) {
CloseHandle(hMutex);
return FALSE;
}
return TRUE;
}
{
HANDLE hMutex = CreateMutex (NULL, TRUE, szName);
if (GetLastError() == ERROR_ALREADY_EXISTS) {
CloseHandle(hMutex);
return FALSE;
}
return TRUE;
}
работает нормально, до компиляции программы (в других программах раньше работало всегда), потом компилирую проект, запускаю exe'шник, потом второй и вылетает ошибка: Access violation at adress: 35313237. Read of adress 35313237. Что делать, может кто знает?
Цитата:
Originally posted by enola
работает нормально, до компиляции программы
работает нормально, до компиляции программы
Это как - "работает нормально, до компиляции...":)
Мютекс лучше создавать при загрузке приложения, а не в момент создания формы IMHO. А проблема, возможно, связана с попыткой закрыть мютекс, если он существует. Какой в этом смысл?
И врятли из-за мутекста. Возможно тут кто-то другой в твоем коде шалит.
Код:
HANDLE hFileMap;
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HWND hwnd;
char* FName;
try {
//Создаем объект файл проецируемый в память
hFileMap = CreateFileMapping((HANDLE)0xffffffff, NULL, PAGE_READWRITE, 0, 4, "NAME");//NAME -> CTRL+SHIFT+G
//если файл с таким именем уже существует, то значит копия программы уже работает
if (hFileMap != NULL && GetLastError() == ERROR_ALREADY_EXISTS){
//тогда ищем окно программы
hwnd = FindWindow("TMainForm", NULL);//TMainForm -> CTRL+SHIFT+G, CreateParams - перекрыть
//если окно найдено и передан параметр в командной строке, то отправляем его работающей программе
if(hwnd) {
//находим пробел после имени исполняемого файла
while(CmdLine != NULL) {
if(*CmdLine++ == ' ') {
FName = CmdLine;
break;
}
}
//если после пробела, что-то есть
if(FName != '\0') {
COPYDATASTRUCT CopyData = { 0, strlen(FName) + sizeof(char), FName};
SendMessage( hwnd, WM_COPYDATA, NULL, reinterpret_cast<LPARAM>(&CopyData));
}
}
CloseHandle(hFileMap);//закрываем описатель
return 0;
}
Application->Initialize();
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->CreateForm(__classid(TMapExplorerForm), &MapExplorerForm);
Application->Run();
CloseHandle(hFileMap);
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::WMCopyData(TMessage& Message)
{
/*×òîáû ïðîâåðèòü ðàáîòó ýòîãî ñîîáùåíèÿ íóæíî çàêðûòü MainForm â äèçàéíåðå*/
DWORD CountData;
PCOPYDATASTRUCT PassedCopyDataStruct;
if (FPassedCommandLine != NULL) {
delete[] FPassedCommandLine;
FPassedCommandLine = NULL;
}
PassedCopyDataStruct = reinterpret_cast<COPYDATASTRUCT*>(Message.LParam);
CountData = PassedCopyDataStruct->cbData;
if (CountData > 0) {
FPassedCommandLine = new char[CountData];
if (PassedCopyDataStruct->lpData != NULL)
memmove(FPassedCommandLine, PassedCopyDataStruct->lpData, CountData);
}
Win32Check( ReplyMessage(true) );
if(FPassedCommandLine)
CreateMDIChild(FPassedCommandLine, Block1);
Application->Restore();
SetForegroundWindow(Handle);
}
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HWND hwnd;
char* FName;
try {
//Создаем объект файл проецируемый в память
hFileMap = CreateFileMapping((HANDLE)0xffffffff, NULL, PAGE_READWRITE, 0, 4, "NAME");//NAME -> CTRL+SHIFT+G
//если файл с таким именем уже существует, то значит копия программы уже работает
if (hFileMap != NULL && GetLastError() == ERROR_ALREADY_EXISTS){
//тогда ищем окно программы
hwnd = FindWindow("TMainForm", NULL);//TMainForm -> CTRL+SHIFT+G, CreateParams - перекрыть
//если окно найдено и передан параметр в командной строке, то отправляем его работающей программе
if(hwnd) {
//находим пробел после имени исполняемого файла
while(CmdLine != NULL) {
if(*CmdLine++ == ' ') {
FName = CmdLine;
break;
}
}
//если после пробела, что-то есть
if(FName != '\0') {
COPYDATASTRUCT CopyData = { 0, strlen(FName) + sizeof(char), FName};
SendMessage( hwnd, WM_COPYDATA, NULL, reinterpret_cast<LPARAM>(&CopyData));
}
}
CloseHandle(hFileMap);//закрываем описатель
return 0;
}
Application->Initialize();
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->CreateForm(__classid(TMapExplorerForm), &MapExplorerForm);
Application->Run();
CloseHandle(hFileMap);
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::WMCopyData(TMessage& Message)
{
/*×òîáû ïðîâåðèòü ðàáîòó ýòîãî ñîîáùåíèÿ íóæíî çàêðûòü MainForm â äèçàéíåðå*/
DWORD CountData;
PCOPYDATASTRUCT PassedCopyDataStruct;
if (FPassedCommandLine != NULL) {
delete[] FPassedCommandLine;
FPassedCommandLine = NULL;
}
PassedCopyDataStruct = reinterpret_cast<COPYDATASTRUCT*>(Message.LParam);
CountData = PassedCopyDataStruct->cbData;
if (CountData > 0) {
FPassedCommandLine = new char[CountData];
if (PassedCopyDataStruct->lpData != NULL)
memmove(FPassedCommandLine, PassedCopyDataStruct->lpData, CountData);
}
Win32Check( ReplyMessage(true) );
if(FPassedCommandLine)
CreateMDIChild(FPassedCommandLine, Block1);
Application->Restore();
SetForegroundWindow(Handle);
}
Цитата:
Originally posted by 3D Bob
Ошибка эта возникат при доступе к памяти принадлежаще не твоей программе.
И врятли из-за мутекста. Возможно тут кто-то другой в твоем коде шалит.
Ошибка эта возникат при доступе к памяти принадлежаще не твоей программе.
И врятли из-за мутекста. Возможно тут кто-то другой в твоем коде шалит.
Ага барабачки...:).
Цитата:
Originally posted by 3D Bob
И врятли из-за мутекста. Возможно тут кто-то другой в твоем коде шалит.
И врятли из-за мутекста. Возможно тут кто-то другой в твоем коде шалит.
нет точно из-за него! Вылетает эта ошибка и все тут. Пробовал и не при создании формы, все равно одна беда. Ну и ладно, сделал по другому :)