Solved

Help using ShellExecuteEx

Posted on 2000-04-10
8
205 Views
Last Modified: 2010-04-02
I have developed two applications (A, B). What I wanted to do is to run B from A. I used the following code, in the application A, to execute B:

SHELLEXECUTEINFO aShellExecStruct;
      aShellExecStruct.cbSize = sizeof(SHELLEXECUTEINFO);
      aShellExecStruct.fMask = SEE_MASK_NOCLOSEPROCESS;
      aShellExecStruct.hwnd = ::GetDesktopWindow();
      aShellExecStruct.lpVerb = "open";
      aShellExecStruct.lpFile ="B.exe";
      aShellExecStruct.lpParameters = lpszPathName;
      aShellExecStruct.lpDirectory = "c:\\temp";
      aShellExecStruct.nShow = SW_SHOWNORMAL;
      
      
      BOOL aResult = ::ShellExecuteEx(&aShellExecStruct);      
      if (aResult)
      {
            HANDLE aProcHandle = aShellExecStruct.hProcess;
            if (aProcHandle)
            {
                  ::WaitForSingleObject(aProcHandle, INFINITE);
            }
      }
      else
      {
            AfxMessageBox("cannot run B");
      }

The problem I have now is that, after closing B, it should return two variables so I could use them in A. I can't figure out how to do this.
Any help will be greatly appreciated,
regards,
Carlos
0
Comment
Question by:qocarlos
  • 3
  • 3
  • 2
8 Comments
 
LVL 86

Accepted Solution

by:
jkr earned 50 total points
ID: 2701177
There are several ways of doing IPC, but as you only want to pass 2 variables, I assume named pipes, mailslots and sockets will be quite an overhead.

My suggestions (in order of preference) would be to
- use the registry as an intermediate storage (e.g. HKLM\Software\MyCompany\B) and add the variables as values here or
- let B.exe write the results to a file which can be read by A.

Feel free to ask if you need more information!
0
 
LVL 9

Expert Comment

by:ShaunWilde
ID: 2701206
Have you tried GetExitCodeProcess(...)

some pseudo code (i.e. I've not tested this)

if (aProcHandle)
{
   HANDLE hDupProcess;
   ::WaitForSingleObject(aProcHandle, INFINITE);
   DWORD dwExitCode;
   ::GetExitCodeProcess(aProcHandle,&dwExitCode);

}

- you may have to dupicate the process handle before WaitForSingleObject(...)

some more pseudo code

if (aProcHandle)
{
   HANDLE hDupProcess;
   ::DuplicateHandle(...,aProcHandle,...,hDupProcess,...);
   ::WaitForSingleObject(aProcHandle, INFINITE);
   DWORD dwExitCode;
   ::GetExitCodeProcess(hDupProcess,&dwExitCode);

}

0
 
LVL 86

Expert Comment

by:jkr
ID: 2701227
It's not necessary to 'DuplicateHandle()' - well, I also thought of using the exit code, but as qocarlos wants to pass two variables, it doesn't seem to be an option (hmm, and we still don't know what type of data these variables contain...)
0
 
LVL 3

Author Comment

by:qocarlos
ID: 2701228
Hi jkr,
Thanks for your answer!
I can write the variables from B (either to the registry or to a file) but I need to do it only in the case that B has be executed from A. If B was executed like a stand-alone application,
I don't want to write this file.
How can I know this? and also, which is the best place in B to save the variables (they belong to the document derived class)?

Carlos
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 3

Author Comment

by:qocarlos
ID: 2701252
About the GetExitCodeProcess(...) function:
The variables I need to get are in double floating format (for instance, numbers 123.732 and -89.12)
I think I can't do this with GetExitCodeProcess or am I wrong?

Carlos
0
 
LVL 9

Expert Comment

by:ShaunWilde
ID: 2701275
oops sorry - I thought he wanted to get the return code (1 value) not two seperate values :)

yup - registry or file - or you could send a message to the other app with the data in
0
 
LVL 86

Expert Comment

by:jkr
ID: 2701339
>>If B was executed like a stand-alone
>>application, I don't want to write
>>this file.

You could do this by passing an additional argument on the command line, e.g.

"b.exe /saveresults"

and check it from within b.exe by using

if ( strstr ( GetCommandLine(), "/saveresults"))
{
 // ...
}

I think the best place to store them is either

HKLM\Software\MyCompany\b

or

HKCU\Software\MyCompany\b

The problem with using a file is that both apps have to agree on a location where to store/look for it...

0
 
LVL 3

Author Comment

by:qocarlos
ID: 2703219
Thanks!
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

912 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

20 Experts available now in Live!

Get 1:1 Help Now