Here's how I do it.
First, I always launch emacs through a .bat file, here's what it contains:
| @ECHO OFF
:: CUSTOMIZE THESE
set install_dir=YOUR_EMACS_BIN_DIR_HERE
set emacs_config_dir=YOUR_EMACS.D_PATH_HERE
set buffer=%1
if ""%1""=="""" set buffer=new
%install_dir%\emacsclient.exe --no-wait ^
--alternate-editor "%install_dir%\runemacs.exe" ^
-f "%emacs_config_dir%\server" %buffer%
|
If Emacs, isn't running, it launches a new instance (that's the "runemacs.exe" bit). If it is running, it opens a new buffer in the running instance.
You can call the script on the command line and pass it a filename as parameter. If none is provide it will open a buffer called "new". You can also drag and drop a file on the script via the explorer.
A small note on the "server" file: Basically, to detect if an instance is running, emacs will check a file, called the server file. This file records the currently running emacs process, if any. Here I opt to specify the server file explicitly (otherwise it uses an obscure temporary location; and I don't remember exactly why but I had problem with that).
Second, you need the include the line "(server-start)" at the end of your init.el (or .emacs) file. If you don't do this, emacs won't write to the server file, and each invocation of the script will launch its own instance.
More stuff (including how to do this little dance on Linux & Mac OSX) here:
https://github.com/norswap/.emacs.d