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

Ваш аккаунт

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

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

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

Перенаправление после запуска второй копии exe

9.9K
07 марта 2006 года
KhArt
11 / / 23.08.2005
Ситуация:
Есть моя прорга работает с файлами *.dwp, т.е. по клику на файле она его открывает.
Как сделать так чтобы при запущеной моей проге клик на другом файле *.dwp не создавал второй экземпляр, а открывал в первой?
А если еще конретнее, то как передать первый экземпляр строку с новым именем файла?
- Пробовал через FindWindow() и SendMessage(), но както криво...
есть ли другие способы?
247
07 марта 2006 года
wanja
1.2K / / 03.02.2003
Поставь Event или Mutex.
406
07 марта 2006 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by wanja
Поставь Event или Mutex.



Можно использовать файл,открыть его первым экземпляром на чтение и расшарить на чтение/запись. и висеть в отдельном потоке в ожидании туда строки с путем к новому файлу,а как эта строка туда запишется из второй копии программы то прочитать ее и удалить. и ждать новых данных. а вторая копия после того как передала нужную инфу в файл - закрылась. Т.е все же лучше создать именованый мьютекс. И затем в других копиях проги если данный мьютекс существует,открывать файл на запись,затем писать туда путь и закрываться.

246
09 марта 2006 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by KhArt

...
Как сделать так чтобы при запущеной моей проге клик на другом файле *.dwp не создавал второй экземпляр, а открывал в первой?
...


Сильно подрезано, но смысл д.б. понятен

Код:
...
HANDLE hFileMap=0;
...
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    HWND hwnd;
    char*  FName;

   
    try {
    //Ñîçäàåì îáúåêò ôàéë ïðîåöèðóåìûé â ïàìÿòü
         hFileMap = CreateFileMapping((HANDLE)0xffffffff, NULL, PAGE_READWRITE, 0, 4, "{9E07789C-14DB-44BA-A6F9-8CF4CDE138B5}");//CTRL+SHIFT+G
         //åñëè ôàéë ñ òàêèì èìåíåì óæå ñóùåñòâóåò, òî çíà÷èò êîïèÿ ïðîãðàììû óæå ðàáîòàåò
         if (hFileMap != NULL && GetLastError() == ERROR_ALREADY_EXISTS){
            //òîãäà èùåì îêíî ïðîãðàììû
            hwnd = FindWindow("TMainForm", NULL);
            //åñëè îêíî íàéäåíî è ïåðåäàí ïàðàìåòð â êîìàíäíîé ñòðîêå, òî îòïðàâëÿåì åãî ðàáîòàþùåé ïðîãðàììå
            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);//&#231;&#224;&#234;&#240;&#251;&#226;&#224;&#229;&#236; &#238;&#239;&#232;&#241;&#224;&#242;&#229;&#235;&#252;
            return 0;
    }


    Application->Initialize();
    Application->CreateForm(__classid(TMainForm), &MainForm);
         ...
    Application->Run();
    CloseHandle(hFileMap);
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    return 0;
}
...
//main.h
protected:
    BEGIN_MESSAGE_MAP
        ...
        VCL_MESSAGE_HANDLER(WM_COPYDATA, TMessage, WMCopyData)
    END_MESSAGE_MAP(TForm)

//main.cpp
//---------------------------------------------------------------------------
void __fastcall TMainForm::WMCopyData(TMessage& Message)
{
    ...
    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);//user defined funck

    Application->Restore();
    SetForegroundWindow(Handle);
}

void __fastcall TMainForm::FormShow(TObject *Sender)
{
    char* FName = NULL;

    ...

    while(CmdLine != NULL) {
        if(*CmdLine++ == ' ') {
            FName = CmdLine;
            break;
        }
    }

    if(*FName != '\0')
        CreateMDIChild(FName, Block1);
   
    ...
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог