Re: Prevent to exec second copy of application



In win32 you can use a shared dll. I define the following in my app dll and then usually have a very small exe load that dll, checking if the dll has been loaded before running another instance of the app.

#ifdef GDK_WINDOWING_WIN32
#pragma data_seg(".shared")
 gint32 app_inst_count = 0;
 HWND app_hwnd = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")
__declspec (dllexport)
LONG IncrementInstanceCount (void)
{
 return InterlockedExchangeAdd(&app_inst_count,1);
}
__declspec (dllexport)
LONG GetInstanceCount (void)
{
 return app_inst_count;
}
__declspec (dllexport)
LONG DecrementInstanceCount (void)
{
 return InterlockedExchangeAdd(&app_inst_count,-1);
}
__declspec (dllexport)
LONG BringSimoToTheFront ()
{
 if( app_hwnd ){
   SetForegroundWindow( app_hwnd );
   return 1;
 }
 else
   return 0;
}
#endif


jakonda jakarta wrote:

Helo, I try to force my application to be only one on display,
I mean if somebody do

$./my-program
OK!
$./my-program
There is another copy. Use it

My algorithm is follow: create atom, check if it selected by somebody, if it so another copy of application is running, if it not so we are alone, select atom and work.

Code is follows:
--------------------------------------------------------------------------------------------------------------
$ cat main.cpp
#include <gdk/gdk.h>

#include <gtk/gtk.h>
#include <cstdlib>
#include <cstring>


gint OnDelete(GtkWidget *widget, GdkEvent *event, gpointer data);
gint OnDestroy(GtkWidget *widget, GdkEvent *event, gpointer data);

int main(int argc, char *argv[])
{
 gtk_init(&argc, &argv);

GtkWidget *topLevelWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_signal_connect(GTK_OBJECT(topLevelWindow), "delete_event", GTK_SIGNAL_FUNC(OnDelete), NULL); gtk_signal_connect(GTK_OBJECT(topLevelWindow), "destroy", GTK_SIGNAL_FUNC(OnDestroy), NULL);
 gtk_widget_show(topLevelWindow);
GdkAtom atom=gdk_atom_intern("MY_PRIVATE_ATOM_GTK_EXAMPLE", FALSE);
 if(gdk_selection_owner_get_for_display(gdk_display_get_default(), atom)!=NULL)
       g_print("There is another copy\n");
 gtk_selection_owner_set_for_display(gdk_display_get_default(),
                                                  topLevelWindow, atom, 0);
gtk_main();
 g_print("Done!\n");
 return EXIT_SUCCESS;
}

gint OnDelete(GtkWidget *widget, GdkEvent *event, gpointer data)
{
 return FALSE;
}

gint OnDestroy(GtkWidget *widget, GdkEvent *event, gpointer data)
{
 g_print("Shutting down\n");
 gtk_main_quit();
 return 0;
}
--------------------------------------------------------------------------------------------------------------
but it didn't work, what wrong?
May be there is another algorithm to prevent starting second copy of application in the same dipslay?

With regards, Jan.

PS
 I don't want to use bonobo.

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]