|
ShellExecute/CreateProcess problem
--------------------------------------------------------------------------------
Hi,
I am using the GNU diff.exe application.
when i use command line and type thise line:
>diff.exe 1.txt 2.txt > 1.out
it works wonderfully!
now, trying to do so via code (i.e usnig Shellexecute or createprocess) doesn't work for me
here is a code snip:
szOperation = _T("diff.exe");
szParams = _T("1.txt 2.txt > 1.out");
HINSTANCE h = ShellExecute(NULL,
_T("open"),
szOp,
szPar,
NULL,
SW_HIDE);
int i = (int)h;
using the createprocess also doesn't work:
STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
::ZeroMemory(&siStartupInfo, sizeof(siStartupInfo));
::ZeroMemory(&piProcessInfo, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
siStartupInfo.wShowWindow = SW_HIDE;
bSucc = CreateProcess(szOp,
szPar,
0,
0,
FALSE,
CREATE_DEFAULT_ERROR_MODE,
0,
0,
&siStartupInfo,
&piProcessInfo);
while (TRUE)
{
GetExitCodeProcess(piProcessInfo.hProcess, &dwExitCode);
if (dwExitCode != STILL_ACTIVE)
break;
else
Sleep(50);
}
CloseHandle(piProcessInfo.hProcess);
HERE THE TROUBLE IS THAT THE PROCESS SUCCEEDS BUT THE dwExitCode returns value of 2 which according to diff.exe is a failure
what can I do to fix this?
thanks in advaned
Yaron
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
You'll need to do one of two things:
1) Put diff.exe 1.txt 2.txt > 1.out in a .BAT file and call ShellExecute() or CreateProcess() using the name of the .BAT file.
2) Redirect the output of the child process using a pipe. See here and here for details.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
1. try to do it, but then got GetLastError of 126 which means:
"126 The specified module could not be found. ERROR_MOD_NOT_FOUND "
2. i'm sure there is a simplier way without using a pipe no?
|
|
|
|
|
What you are likely experiencing is that the exit code has not really been set yet because diff.exe has not finished.
So after CreateProcess
add the code WaitForSingleObject(piProcessInfo.hProcess, INFINITE);
The process handle will get signalled when the process exits and the exit code will then be valid.
Also, don't pass CREATE_DEFAULT_ERROR_MODE, but rather pass 0.
|
|
|
|
|
Not true!
look at the loop above
while (TRUE)
{
GetExitCodeProcess(piProcessInfo.hProcess, &dwExitCode);
if (dwExitCode != STILL_ACTIVE)
break;
else
Sleep(50);
}
I will try not to use CREATE_DEFAULT_ERROR_MODE, and pass 0.
|
|
|
|
|
Output redirection with > is part of the command interpreter, not the OS. You need to set the STARTUPINFO::hStdOutput accordingly to redirect output.
--Mike--
LINKS~! Ericahist updated! | 1ClickPicGrabber | CP SearchBar v2.0.2 | C++ Forum FAQ
Strange things are afoot at the U+004B U+20DD
|
|
|
|
|
I agree with you, but if i simply use
op = "diff.exe"
par = "1.txt 2.txt"
and not use the > for output (it is simply using the stdout)
i still get ExitCode 2 from the diff.exe proccess which means an error
any suggestions?
|
|
|
|
|
YaronNir wrote:
i still get ExitCode 2...
Which tells you exactly what the problem is - the program cannot be found. Prepend a path to diff.exe and the problem will go away.
|
|
|
|
|
I would like to place the OpenFileDialog in a specific spot on my dialog, but I can not do that because it's not a drop in control. I look for 3rd party freebies to no avail......any ideas
|
|
|
|
|
If you're saying that you just want to open the OpenFileDialog, you could drop in a button and handle opening it from there. Just an idea.
|
|
|
|
|
You have to customize the OpenFile Dialog template, not a trivial task. Look it up in MSDN.
Cheers
Steen
|
|
|
|
|
I've never overloaded the equality operator and am having difficulty finding example code in MSDN for doing so. I'm guessing it looks a little something like this:
<br />
bool CLASS_NAME::operator==( const CLASS_NAME & rhs ) const<br />
{<br />
}<br />
Is this correct or am I missing something?
________________________________________________________________________
The question "Do computers think?" is the same as "Can submarines swim?"
Signature Red Studios
Jeryth
|
|
|
|
|
Here is a way to do it
Class YourClass
{
public:
void operator=(const &YourClass c);
private:
int iNum;
CString szStr;
}
void YourClass::operator=(const &YourClass c)
{
iNum = c.iNum;
szStr = c.szStr;
}
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
Excellent example of an assignment operator overload. Unfortunately this was not what the OP wanted, he asked for a equality operator overload!
|
|
|
|
|
opps
about equality,your code looks ok...so there shouldn't be any problem
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
|
Your operator is correct !
|
|
|
|
|
Wow, got it right on the first guess. Thanks for the confirmation.
________________________________________________________________________
The question "Do computers think?" is the same as "Can submarines swim?"
Signature Red Studios
Jeryth
|
|
|
|
|
hi,
I have some tbbuttons with text only on my toolbar.
The code looks like
<br />
for(int s = 0 ; s < groups.size() ; s++){<br />
if (groups.at(s).IsVisible()){<br />
tbb[m].iBitmap = I_IMAGENONE;<br />
tbb[m].iString = m_wndToolBar1.GetToolBarCtrl().AddStrings(groups.at(s).GetGroupName());<br />
tbb[m].fsState = (m==0)?TBSTATE_CHECKED:0 |TBSTATE_ENABLED;<br />
tbb[m].fsStyle = BTNS_BUTTON|BTNS_CHECKGROUP|BTNS_SHOWTEXT;<br />
tbb[m].idCommand = IDM_FIRST_OPENGROUP + groups.at(s).GetGroupId();<br />
m++;<br />
}<br />
}<br />
m_wndToolBar1.GetToolBarCtrl().AddButtons(m, tbb);
<br />
m_wndToolBar1.GetToolBarCtrl().SetButtonSize(CSize(95,35));<br />
THIS last line i have to add so the text will be on my buttons. If i don't change the button size then the text is completely of the button (except for 1 pixel).
SO after changing, my button is 35 pixels high, but the text is completely on the bottom half of the button.
I just want to have small buttons (let's say standard size (22pixels)) but then my text isn't readable. How can i solve this?
greets,
tim635
|
|
|
|
|
I'm getting a C1001 error (internal compiler error) with the following console app:
#include <windows.h>
class blah {
public:
blah();
~blah();
} ;
blah::blah()
{
}
blah::~blah
{
}
int main( void )
{
return 0;
}
I know exactly where the error is (I somehow managed to forget the "()" after "blah::~blah"), but is anyone else seeing this compiler error on VC6 w/SP6? It took me long enough to find the true error...
Speaking of which, does MS still intend to release service packs or hotfixes for VC6 at this point in time?
|
|
|
|
|
Daniel Desormeaux wrote:
Speaking of which, does MS still intend to release service packs or hotfixes for VC6 at this point in time?
Like most things, unless data integrity is involved, it'll likely not get fixed. For a product that is roughly six years old, it does not make sense to make changes to it simply for the sake of making changes.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
Is there the client still the king? )
SkyWalker
|
|
|
|
|
hello,
i have a problem i have been trying to solve for the last two weeks but i haven't even come close to finding a solution.
In my SDI app, i open a dialog through the document class by obtaining the view and opening the dialog:
<br />
POSITION pos = GetFirstViewPosition();<br />
G5GravFormVW * view = (G5GravFormVW *)GetNextView(pos);<br />
...<br />
m_gravureDlg.Create(view);<br />
m_gravureDlg.ShowWindow(SW_SHOW);<br />
m_gravureDlg.UpdateWindow();<br />
i then need to update the controls on this window through callback functions so i use:
<br />
if (AfxGetMainWnd()->GetForegroundWindow() != NULL)<br />
AfxGetMainWnd()->GetForegroundWindow()->SetDlgItemText(1033, "Ajout du fichier: '" + CString(object->GetFileName()) + "'...");<br />
if (AfxGetMainWnd()->GetForegroundWindow() != NULL)<br />
AfxGetMainWnd()->GetForegroundWindow()->UpdateWindow();<br />
It has been working fine for Windows 98, NT and 2000 but now with window XP, there's a problem: when i open another application (let's take for example Windows Explorer) on top of my app and then close or minimize the new app window to come back to my app's window, the window (dialog) i opened is not refreshed or redrawn anymore whereas it was before using Win XP. so it's impossible to follow the progress of my app!
i tried all the Window State and Update/Painting Functions, SetForegroundWindow (), Invalidate (), BeginModalState (), etc... but nothing is working.
thanks for ur help
|
|
|
|
|
Hola!
I´m making a small Windows Forms App. using VC++.net 2003.
Adding a "MessageBox" in the self generated code (the Form1.h - file) works fine, until I add my own header file to the project and include this new header file at the top of the "Form1.h" -file.
I get the error message:
error C2653:"MessageBoxA" is not a class or a namespace name.
Why this "MessageBoxA"?
What could be wrong?
thanks
doneirik
|
|
|
|
|
doneirik wrote:
Adding a "MessageBox" in the self generated code...
Are you adding your own MessageBox() function, or are you calling MessageBox() ? If the latter, why do this in a .H file?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|