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

Ваш аккаунт

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

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

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

Вторая копия программы

335
17 августа 2005 года
enola
379 / / 25.01.2005
Добрый день!
Влючаю в текст программы код:
 
Код:
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;
}


работает нормально, до компиляции программы (в других программах раньше работало всегда), потом компилирую проект, запускаю exe'шник, потом второй и вылетает ошибка: Access violation at adress: 35313237. Read of adress 35313237. Что делать, может кто знает?
1
17 августа 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by enola

работает нормально, до компиляции программы


Это как - "работает нормально, до компиляции...":)
Мютекс лучше создавать при загрузке приложения, а не в момент создания формы IMHO. А проблема, возможно, связана с попыткой закрыть мютекс, если он существует. Какой в этом смысл?

299
17 августа 2005 года
3D Bob
885 / / 18.04.2005
Ошибка эта возникат при доступе к памяти принадлежаще не твоей программе.
И врятли из-за мутекста. Возможно тут кто-то другой в твоем коде шалит.
246
17 августа 2005 года
GIZMO
1.8K / / 30.07.2004
Код:
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)
{
    /*&#215;&#242;&#238;&#225;&#251; &#239;&#240;&#238;&#226;&#229;&#240;&#232;&#242;&#252; &#240;&#224;&#225;&#238;&#242;&#243; &#253;&#242;&#238;&#227;&#238; &#241;&#238;&#238;&#225;&#249;&#229;&#237;&#232;&#255; &#237;&#243;&#230;&#237;&#238; &#231;&#224;&#234;&#240;&#251;&#242;&#252; MainForm &#226; &#228;&#232;&#231;&#224;&#233;&#237;&#229;&#240;&#229;*/
    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);
}
1
17 августа 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by 3D Bob
Ошибка эта возникат при доступе к памяти принадлежаще не твоей программе.
И врятли из-за мутекста. Возможно тут кто-то другой в твоем коде шалит.


Ага барабачки...:).

335
17 августа 2005 года
enola
379 / / 25.01.2005
Цитата:
Originally posted by 3D Bob
И врятли из-за мутекста. Возможно тут кто-то другой в твоем коде шалит.



нет точно из-за него! Вылетает эта ошибка и все тут. Пробовал и не при создании формы, все равно одна беда. Ну и ладно, сделал по другому :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог