views:

131

answers:

3

Hey all, this is my first question I'm posting on this website so if it isn't the correct way to do it I would like to apologize upfront.

I am making an image uploader (upload image to image hosting website) and I'm having some issues passing an argument (image location to an already running application)

-First of all let's say MyApp.exe is always running -Whenever I right click on an image I have added an item in the default windows context menu that says "Upload image". -When that's clicked it needs to pass the location to the already running application.

My program.cs:

static class Program
{
    [DllImport("user32.dll")]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, UIntPtr
    wParam, IntPtr lParam);

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern uint RegisterWindowMessage(string lpString);

    [STAThread]
    static void Main(params string[] Arguments)
    {
        if (Arguments.Length > 0)
        {
    //This means that the the upload item in the context menu is clicked
    //Here the method "uploadImage(string location)"
    //of the running application must be ran
        }
        else
        {
    //just start the application
            Application.Run(new ControlPanel());
        }
    }
}

Note that the ControlPanel class doesn't have a visible form, only a tray icon is present since a form is not needed.

Could I get any help on how to do this?

Regards, Kenny

A: 

Assuming that you have control over the execution environment, the listening application could just expose an endpoint using WCF or even a raw TCP socket. That way, any other application can connect to it in a dynamic but structured fashion.

Even though both the sender and receiver are on the same machine, using a network transport solution (like WCF or TCP) is a great way to safely send data across processes.

Here's an example of how to do it in TCP with c#: http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server

WCF can be a bit more complicated (due in part to it's flexibility, and also due to serialization restrictions) but there is plenty of documentation online on how to use it. WCFis a more object-oriented solution because proxy classes can be generated that allow you to make strongly-typed calls to actual objects, versus just sending messages.

Tim
+1  A: 

Well you will have to establish a communication channel for other applications to post the images to. This communication channel can be one of the following - not a complete list just samples:

  • A directory that is watched by your app and the file is added once it is added to the directory.
  • A port where other applications can send information to.
  • A self-hosted web service that accepts the images.
  • A TCP port that receives the images.
  • A named pipe.
  • ....

As you see there are several possibilities. The right one for you depends on your scenario. The file system is an option that can be implemented easily using a FileSystemWatcher for a sample see here.

A self-hosted web sevice exposes a web service that can receive images. See here for a sample.

IMHO, these are the two options that are easiest. But ... there are several more.

For the TCP port see Tim's post.

Obalix
+1 for the FileSystemWatcher suggestion. I have used a watcher on many applications with great results. I wouldn't use one if synchronous communication or a request/response relationship was required, but it doesn't sound like those are requirements.
Tim
Hi, thanks that gave me some extra ideas but you should know that I don't have control over the image hosting website. I just upload the image by doing a POST submit and retrieving the response (which contains the link of the uploaded image, on the internet)I tried the TCP idea but for some reason I don't think that's the thing I need.I got a fully working application that uploads images etc. The only thing I need now is:
Kenny
+1  A: 

Hi,

I have figured it out, so awesome thanks for the person who posted the http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/a5bcfc8a-bf69-4bbc-923d-f30f9ecf5f64 link, this is exactly what I was looking for!

Here's a the full solution:

static class Program
{
    [STAThread]
    static void Main(params string[] Arguments)
    {
        SingleInstanceApplication.Run(new ControlPanel(), NewInstanceHandler);
    }

    public static void NewInstanceHandler(object sender, StartupNextInstanceEventArgs e)
    {
        string imageLocation = e.CommandLine[1];
        MessageBox.Show(imageLocation);
        e.BringToForeground = false;
        ControlPanel.uploadImage(imageLocation);
    }

    public class SingleInstanceApplication : WindowsFormsApplicationBase
    {
        private SingleInstanceApplication()
        {
            base.IsSingleInstance = true;
        }

        public static void Run(Form f, StartupNextInstanceEventHandler startupHandler)
        {
            SingleInstanceApplication app = new SingleInstanceApplication();
            app.MainForm = f;
            app.StartupNextInstance += startupHandler;
            app.Run(Environment.GetCommandLineArgs());
        }
    }  
}

Thanks alot all, and especially the person who posted that link I mentioned above but I guess he deleted his answer?

Regards, Kenny

Kenny