...
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);//çàêðûâàåì îïèñàòåëü
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);
...
}
Перенаправление после запуска второй копии exe
Есть моя прорга работает с файлами *.dwp, т.е. по клику на файле она его открывает.
Как сделать так чтобы при запущеной моей проге клик на другом файле *.dwp не создавал второй экземпляр, а открывал в первой?
А если еще конретнее, то как передать первый экземпляр строку с новым именем файла?
- Пробовал через FindWindow() и SendMessage(), но както криво...
есть ли другие способы?
Поставь Event или Mutex.
Цитата:
Originally posted by wanja
Поставь Event или Mutex.
Поставь Event или Mutex.
Можно использовать файл,открыть его первым экземпляром на чтение и расшарить на чтение/запись. и висеть в отдельном потоке в ожидании туда строки с путем к новому файлу,а как эта строка туда запишется из второй копии программы то прочитать ее и удалить. и ждать новых данных. а вторая копия после того как передала нужную инфу в файл - закрылась. Т.е все же лучше создать именованый мьютекс. И затем в других копиях проги если данный мьютекс существует,открывать файл на запись,затем писать туда путь и закрываться.
Цитата:
Originally posted by KhArt
...
Как сделать так чтобы при запущеной моей проге клик на другом файле *.dwp не создавал второй экземпляр, а открывал в первой?
...
...
Как сделать так чтобы при запущеной моей проге клик на другом файле *.dwp не создавал второй экземпляр, а открывал в первой?
...
Сильно подрезано, но смысл д.б. понятен
Код: