protect delphi application

Posted on 2007-11-16
Last Modified: 2012-06-27
HI experts.
I need to make a delphi application that can't be run by user only if it's called by my other delphi application. Is there a way to do this?
Thanks for help.

Question by:A. Cristian Csiki
  • 2
  • 2
LVL 19

Accepted Solution

MerijnB earned 250 total points
ID: 20297443
see this code snippet. It returns the full path of the process called the running app, then you can check for this.

function TForm1.GetProcessParent(): string;


  snap: DWORD;


  currprocid: DWORD;

  parentproc: DWORD;

  parentprocid: DWORD;

  parentpath: string;

  isparent: Boolean;

  time_currentproc: FILETIME;

  time_create: FILETIME;

  time_exit: FILETIME;

  time_kernel: FILETIME;

  time_user: FILETIME;


  isparent := False;

  //create snapshot of all processes

  snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  if snap <> INVALID_HANDLE_VALUE then


    pe32.dwSize := SizeOf(pe32);

    //walk through processes to find the current process info

    if Process32First(snap, pe32) then


      currprocid := GetCurrentProcessId(); //store current process id for faster access


        if pe32.th32ProcessID = currprocid then


          //we've found the current process info


           now we should compare current process start time with the parent process

           start time, to check if the parent process CAN be the real parent

           (process identifiers are reusable, so when the parent process terminates,

           any other process started later on can get the same ID)


          GetProcessTimes(GetCurrentProcess(), time_create, time_exit, time_kernel, time_user);

          time_currentproc := time_create;

          parentprocid := pe32.th32ParentProcessID;

          parentproc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, parentprocid);

          if parentproc <> 0 then


            if GetProcessTimes(parentproc, time_create, time_exit, time_kernel, time_user) then


              isparent := CompareFileTime(time_create, time_currentproc) < 0;


               now we determined, that parentprocess CAN BE

               the parent of the current process


              SetLength(parentpath, 1024); //1024 should be enough for the full path :)

              GetModuleFileNameEx(parentproc, 0, PChar(parentpath), 1024);

              parentpath := PChar(parentpath);




          break; //do not enumerate any further


      until not Process32Next(snap, pe32);




  if IsParent then

   result := ParentPath


   result := '';


Open in new window


Assisted Solution

den4b earned 250 total points
ID: 20297494
1) You can make secondary application find any main applications (by process/window enumeration) and send them a custom (defined by you) message to notify that a new secondary app has been launched (passing process id for example). Main application will then check if it has launched that process, and send back a reply with a message which will tell secondary application if it needs to be terminated or has to continue running.

2) You could also use parameters to a secondary program for this task. For example, make your secondary program terminate if the required parameter wasn't sent to it. You could use some sort of an encoded date/time to call secondary app, and it will decode it and check that the time is within say 5 seconds of timestamp send to it.

There are loads of other ways to do it, but it’s up to you to pick/find the most suitable for you.
LVL 11

Author Comment

by:A. Cristian Csiki
ID: 20298011
The thing I was looking is that mentioned by den4b : how do I receive data from delphi application? Clipbooard?

I think I got it. For a spellcheck and wright keywords I found this in google.:

Thanks mites

Expert Comment

ID: 20298152

Yes, WM_COPYDATA is a generalized message which is used for passing data between applications. Use SendMessage() or PostMessage() function to pass that message with arbitrary data (pointers to data usually).

You can also use any custom user message, for example, define const: WM_MY_APP = WM_USER + 1 (any value actually between WM_USER and 0x7FFF).

Anyway, you are on the right direction now.
LVL 11

Author Comment

by:A. Cristian Csiki
ID: 20298370
Kind regards. ;)

Featured Post

Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…
This tutorial demonstrates a quick way of adding group price to multiple Magento products.

708 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now