• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 913
  • Last Modified:

protect delphi application

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.

Cheers
0
A. Cristian Csiki
Asked:
A. Cristian Csiki
  • 2
  • 2
2 Solutions
 
MerijnBSr. Software EngineerCommented:
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;
var
  snap: DWORD;
  pe32: PROCESSENTRY32;
 
  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;
 
begin
  isparent := False;
 
  //create snapshot of all processes
  snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if snap <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := SizeOf(pe32);
 
    //walk through processes to find the current process info
    if Process32First(snap, pe32) then
    begin
      currprocid := GetCurrentProcessId(); //store current process id for faster access
      repeat
        if pe32.th32ProcessID = currprocid then
        begin
          //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
          begin
            if GetProcessTimes(parentproc, time_create, time_exit, time_kernel, time_user) then
            begin
              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);
            end;
            CloseHandle(parentproc);
          end;
 
          break; //do not enumerate any further
        end;
      until not Process32Next(snap, pe32);
    end;
    CloseHandle(snap);
  end;
 
  if IsParent then
   result := ParentPath
  else
   result := '';
end;

Open in new window

0
 
den4bCommented:
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.
0
 
A. Cristian CsikiSenior System AdministratorAuthor Commented:
Hi.
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.:
http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm

Thanks mites
0
 
den4bCommented:

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.
0
 
A. Cristian CsikiSenior System AdministratorAuthor Commented:
Thanks.
Kind regards. ;)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now