|
excellent, thanks for the code
only thing is, the program i'm writing is a console application.
will the "SHELLEXECUTEIN" work there too?
|
|
|
|
|
Yes, Microsoft show a console app using ShellExecute in WN_DOS.H. 1992
If not you may compile using mfc in console.
Best Wishes and Happy Holiday's,
ez_way
|
|
|
|
|
okay, i'll give it a go. i'm not using MFC at the moment though.
i wanna keep this as simple as prossible. just a "void main()" with a few functions.
its for a cryptanalysis project...
anyways, i dont have time to try it out today, so i'll give it a go tomorow and post back either a "thanks it works" message or "oh crap, i can't get it to work"
|
|
|
|
|
Whoooo looks like you know your way around ShellExecute !!
Here is a question.
I have been using it almost the same way but I need to know if the execution ended in an error, is there any way to know that ?
I use ShellExecute to run PKZIP to unzip a big file and then I just wait with:
<br />
SHELLEXECUTEINFO sei;<br />
sei.cbSize =sizeof(sei);<br />
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = m_hWnd;
sei.lpFile="x.bat";
sei.nShow=SW_MINIMIZE;
sei.lpVerb=NULL; <br />
sei.lpParameters=""; <br />
sei.lpDirectory="";<br />
<br />
<br />
ShellExecuteEx(&sei);<br />
long factor=0;<br />
while (WaitForSingleObject (sei.hProcess, 0)==WAIT_TIMEOUT)<br />
{<br />
factor++;<br />
if (factor==1000)<br />
progbar.StepIt();<br />
<br />
}<br />
The problem is , how do I know for example if the PKZIP did not find the file I told him to look for, or any kind of error....
Shay
|
|
|
|
|
Hi,... Set a thread and monitor it.
When you call if call it through a callback proceedure as a worker thread.
Set you Shellx in the app of your application.
Create a HANDLE in the header of app.
HANDLE myhandle;
Return sei to the callback Now monitor the thread for running, and the handle for terminitation.
If the HANDLE exits with say 0x03 then you know what?
If the HANDLE exits with say 0x00 then you know what?
The worker thread will only un-freeze your app while all this is going on, and is good practice to get into. (I should talk I have several x 100 apps running without threads). If you need help on threads see Newcomers artice here for a good description of threads.
http://www.codeproject.com/cpp/callbacks.asp?target=
If you need help with shellx see P.J.Naughter class called pop3.
http://www.naughter.com
Let me know, work on it and if you don't have it in 2 days I will send you an example.
Best Wishes and Happy Holiday's,
ez_way
|
|
|
|
|
|
sure let me know!
Best Wishes and Happy Holiday's,
ez_way
|
|
|
|
|
How is it going?
Best Wishes and Happy Holiday's,
ez_way
|
|
|
|
|
Hello,
I am trying launching an application telling it to open a document. I build a command line surrounding the program name and each document with quotes and then use ShellExec to process. This works fine with all applications except old Adobe programs (like PhotoDeluxe or Photoshop LE). So I tried CreateProcess instead it does not work either. Tried ShellExecuteEx same error: the program does not find the document. If I take the command line I am builing and paste it in a Command Prompt it works. Other programs are able to run the application passing it a file to open.
So my question is: what other way can I use to run that application telling it to open an application... Should I revert to _exec or is there something else?
Regards,
Nicolas
|
|
|
|
|
What does the code snippet look like that tries to launch Adobe and its command-line arguments?
Five birds are sitting on a fence.
Three of them decide to fly off.
How many are left?
|
|
|
|
|
Something like this:
string fnames;<br />
list<string> sel = GetSelection();<br />
for (list<string>::iterator it = sel.begin(); it != sel.end(); ++it)<br />
fnames += "\"" + *it + "\" ";<br />
<br />
strEditor = "\"" + strEditor + "\"";<br />
strDir= "\"" + strDir+ "\"";<br />
<br />
ShellExecute(NULL, "open", strEditor.c_str(), fnames.c_str(), strDir.c_str());
This works with latest version of Photoshop for instance (6 and later) and Paint Shop Pro but NOT with Photoshop LE 5 and Photoshop Deluxe. CreateProcess and ShellExecuteEx fail the same way: the app is correctly launched but it can't find the files I am passing.
Regards,
Nicolas
|
|
|
|
|
Have you tried calling ShellExecute() with string constants instead of variables? This will tell you if the variables are incorrect.
ShellExecute(NULL, "open", "c:\\program files\\adobe.exe", "file1 c:\\somepath\\file2 file3", "c:\\somedir", ...);
Five birds are sitting on a fence.
Three of them decide to fly off.
How many are left?
|
|
|
|
|
David,
thanks for suggesting. The problem came from the trailing whitespace at the end of fnames. I removed it and it workls!
Thanks again,
Nicolas
|
|
|
|
|
|
Hi,
I have a COM server, and a private class for the internal use of the COM object, what I want to do is to add a a method that returns a CComObject<> * Object, I have two problems:
If I make this:
<br />
CComObject<Connections> *DBGroup::GetGroupConnections(_bstr_t strGroup)<br />
{<br />
CComObject<CConnections>* pConnections; <br />
HRESULT hr = CComObject<CConnections>::CreateInstance(&pConnections);<br />
<br />
(...)<br />
return pConnections; <br />
}<br />
1. I get a compiler error telling me that he don't knows about the Connections com component that I have created in the same server.
2. If Instead of that I return and IConnection interface, Do I generate there a leakage ? ( I don't call the "delete pConnection"), what is the solution or workaround for this problem ?
Thanks in advance, greetings
Braulio
|
|
|
|
|
1.Initialize your object
CComObject<CYourBaseClass>* pConnection;
...
pConnection->AddRef();
return pConnections;
2.Returning a pointer cuases very much a memory leak UNLESS you destroy it in your caller function
CComObject<CYourBaseClass> *pConnection = GetGroupConnections(...);
pConnection->...
pConnection->Release();
Peter Molnar
|
|
|
|
|
So, I can do directly ?
<br />
CComObject<CYourBaseClass>* pConnection;<br />
<br />
pConnection->AddRef();<br />
<br />
return pConnections; <br />
And I don't have to call "CreateInstance" ?
If I want to return my object as an interface( e.g. a list of users that matches a certain criteria), so the collection will not be hold as a member variable, can I use ?
<br />
get_Connection(IConnection **pVal)<br />
{<br />
CComObject<CYourBaseClass>* pConnection;<br />
<br />
pConnection->AddRef();<br />
<br />
return pConnections->QueryInterface(...)<br />
}<br />
And then in the client code retrieve that value with an smart pointer ?
<br />
IConnectionPtr pConn = pMyComObject->Connection;<br />
So with the smart pointer, the object will be released automatically ?
Thanks in advance, greetings
Braulio
|
|
|
|
|
You have very much to call CreateInstance, which I ment to indicate with ... (dots) in my code. Since it was OK in yours, I didn' repeated it again, modify your get_Connection function accordingly. AddRef tells the object that there will be one more call on it, it should not unload itself, and Release tells that the call have already taken place, it can unload.
So after you received the interface pointer,you should release it. Smart pointers indeed eliminate this, because they call AddRef on object creation and Release on when the object goes out of scope.
Peter Molnar
|
|
|
|
|
Hi all,
i have a problem using the system or _exec functions when i try to load an external executable file from my code:
if i use:
system("C://myfolder//converter.exe JONNY.FFT BAGONKY.TXT");
my converter work fine and i find my output file in the "Debug" folder of my project.
if i use:
system("C://Documents and settings//converter.exe JONNY.FFT BAGONKY.TXT");
i don't find anything!!!!
How can i resolve this problem?
|
|
|
|
|
|
dukeleto wrote: my converter work fine and i find my output file in the "Debug" folder of my project.
Which indicates that the current working directory (CWD) is being used.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Dear all,
Can I trap when Windows TaskManager kill me?
Best Regards,
kglau
|
|
|
|
|
On older Windows operating systems, the TaskManager first attempts to send a WM_DESTROY message to the thread's main window, and if it fails, it will attempt to terminate the thread itself. This can be trapped by utilizing simple thread-messaging maps. See MSDN for information about threads and thread messages.
On newer operating systems (2000 and above), the TaskManager will always kill the virtual machine that is running the process that is hang. Hooking this would require some extensive API knowledge and a system wide-hook for trapping low-level kernel operations.
However, I wouldn't suggest that you even attempt to hook the operation, as the TaskManager's process-killing feature is supposed to exist and work properly on every Windows platform to end processes that are hung, acting incorrectly or are not desired.
Overriding the default behaviour would quickly result in users having malicious processes like viruses, torjans or advertising/spying software that cannot be killed without using Safe mode and delicate deletion methods. Find some other way to accomplish whatever it is you are trying to do.
If you are attempting to write a virus/trojan or advertising/spying software, then this is a wrong place to ask. We are coders of honor and respect for our jobs. Our software is made to be enjoyable and useful, not to harass people or hinder users.
-Antti Keskinen
----------------------------------------------
The definition of impossible is strictly dependant
on what we think is possible.
|
|
|
|
|
Hi,
Of course I am not writing a virus/trojan, because writing program is my job, I am also respect
for my job too.
Thanks anyway..
KG
|
|
|
|
|
I have visual studio.net and making a database project with access. But some query runs under access and visual studio.net but same have problem under visual studio.net
and successfully runs under access. I am conneting using ODBC: Microsoft Access driver.
|
|
|
|