|
In case anyone is interested, we have pretty much reached a conclusion after evaluating numerous installers. My brief impressions follow:
Inno Setup: Restricted features.
Tarma Installer: Unable to create merge modules. Nice interface, and cheap.
Install Shield: Feature rich but expensive.
WiX: Complex, and not easy to learn, but very powerful and flexible. And free.
InstallAware: Claims to be powerful, but the unprofessional feel scared us away, and it looks to be developed by one person who engages in online slanging matches with critics. It appears to b a copy of Install Shield by an ex-IS employee.
There are other products, but they all lacked essential features such as custom dialogs, or creation of merge modules.
I am fairly sure we will go with WiX. Commercial install products such as Tarma and InstallShield are easier to use for simple projects, but anything more complex is no easier than WiX.
|
|
|
|
|
Can any body tell What is the best approach by which I can capture the URL change event in IE and Firefox. I read about API hook. Is it the best approach or any other alternative is there.Thanks in advance
Regards
Rajmohan
|
|
|
|
|
I would think a Browser Helper Object (BHO) would be a more suitable choice.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
I think it is a good way,I hope you can do it and show the source code to us
|
|
|
|
|
As David said, it is best to write a browser extension so that you capture such events.
But using this approach, each browser will need a different extension.
A Browser Helper Object (BHO) will only work for IE.
Firefox uses an XML/Javascript/XPCom based extension.
Other browsers may be different.
|
|
|
|
|
Thank you so much for your replies. I will try this and let you know
Regards
Rajmohan
|
|
|
|
|
Rajmohan SK wrote: Can any body tell What is the best approach by which I can capture the URL change event in IE and Firefox. I read about API hook. Is it the best approach or any other alternative is there.Thanks in advance
Regards
Mozilla has his own API, which can easily used by any programmer.. but mind it, it's pretty difficult to register with FireFox client, until and unless user want to install in.
In case of BHO, it can be intalled without user permission.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
Hi
I am looking for work from projects for developing any engineering software CAD/CAM/CAE/FEA/CFD, I am an expert in CC++, VC++,MFC,OPENGL,QT,QWT...in CAD/CAM/CAE/CFD atc... if anyone interested please call me @919900839788
|
|
|
|
|
This board is for asking questions on C/C++/MFC. If you want to search and apply for jobs, look at the jobs board or use one of those job search sites.
“Follow your bliss.” – Joseph Campbell
|
|
|
|
|
Rajesh R Subramanian wrote: This board is for asking questions on C/C++/MFC. If you want to search and apply for jobs, look at the jobs board or use one of those job search sites.
Buddy, I think he is despretly looking for job, thats why posting on every place he find
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
Hi all!
C++, WinAPI
Is there any way to catch when process is being terminated (i.e. terminated by user from Task Manager, or ended in normal case) and do some code there.
In other words I need to execute some code, in any cases when program is ending execution.
Thanks
|
|
|
|
|
You can of course first register the standard C function atexit, but this will only get called on normal program termination. Otherwise register a signal handler and wait for SIGABRT and SIGTERM, just like in UNIX.
http://msdn.microsoft.com/en-us/library/xdkz3x12.aspx[^]
Now I'm not sure HOW the task manager terminates the process, so your mileage may vary...
|
|
|
|
|
Yes, that's what I need, thanks!
|
|
|
|
|
I seem to remember that SIGTERM is never raised, so you want check SIGABRT. I'm sure you'll find that in the doc.
|
|
|
|
|
Yes there is, its called WM_QUIT . A Win32 Message. You must create a Win32 app for this code.
This app is not a console app , its a windows app and will use int WinMain() instead of int main().
PeekMessage() looks into the message queue and checks to see if any messages are waiting. If not, the program will continue on.
If our message is WM_QUIT , then that means its time to exit and return to Windows.
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_QUIT:
break;
case WM_CLOSE:
MessageBox(NULL, "user terminated the window from Taskmanager!", "abnormal exit" , MB_OK);
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"The title of my window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
And thats it.
|
|
|
|
|
This will work only in normal program termination. But if for example application is freezed and user wants to shut it with Task Manager - the execution will not run to main loop, cause application is freezed and dont getting messages from queue. Therefore I need some OS-level way to catch abnormal termination.
|
|
|
|
|
|
Well, the questions was not "How terminate process?", but "How to execute some code when process terminated normal or abnormal?" .
|
|
|
|
|
How to execute some code when process terminated normal or abnormal?
Answer:
WinAPI (Win32) specific only.
If you close the window from Taskmanager's "End Task", then you get the WM_CLOSE notification.
The WM_CLOSE message is sent as a signal that a window or an application should terminate.
BUT
If you click on "End Process" from task manager, then there's no way to handle it, in .NET or Win32.
You better hope that the end user clicks on Taskmanager's "End Task" and not on "End Process" .
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CLOSE:
MessageBox(NULL, "closed the window from Taskmanager!", "abnormal exit" , MB_OK);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
modified on Friday, April 30, 2010 11:01 AM
|
|
|
|
|
Hey, I know how to execute some code when application closing in normal case. I'm not novice, and know how Windows messages system is working. The question is more advanced. What if for example, something go wrong, application freezing - and user terminates it using task manager, terminates it dirty? I need to do some code here.
Probably this is impossible, but look at the answer Michael Godfroid gave me above. This seems to be what I look for. So I'm going to investigate this.
|
|
|
|
|
Tried it.
Doesn't seem to work. I made a console app added a line to pause execution then terminated it from the
task manager. I didn't get the message.
|
|
|
|
|
Did you tried this in debugger? I guess with debugging it will not work.
Try to make infinite loop instead. I mean try following:
In main() make infinite loop.
In signal handler need to do something to identify we here, probably type to console (but this might not work).
Run application without debugging. It's important, cause things like this might behave different when debugger attached.
I didnt tried it myself yet, going to check this on monday.
|
|
|
|
|
Btw, here is from doc.
Note
SIGINT is not supported for any Win32 application. When a CTRL+C interrupt occurs, Win32 operating systems generate a new thread to specifically handle that interrupt. This can cause a single-thread application such as one in UNIX to become multithreaded, resulting in unexpected behavior.
So terminating from Ctrl+C will not work. Try to kill process from task manager.
|
|
|
|
|
I used this code in release mode and killed it from the task manager, while running it from the command line so as to catch the text. - It never came.
Not quite sure what SIGINT has to do with the price of chewing-gum in Czechoslovakia? We're not trying to interrupt the process, we're just terminating it.
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <tchar.h>
void SignalHandler(int signal)
{
printf("Application aborting...\n");
}
int main()
{
typedef void (*SignalHandlerPointer)(int);
SignalHandlerPointer previousHandler;
previousHandler = signal(SIGABRT, SignalHandler);
getch();
abort();
}
However, now that I can't find the page that I lifted the above code from I can't help but get the feeling that this particular approach is an exercise that won't succeed. I reckon that the signal is only thrown when the _application_ calls abort(), and not when windows calls abort(theApp).
I wonder if you'd have to hook TerminateProcess or something similar. I've a feeling that such a solution will require a fairly hard-core answer. Good-luck
|
|
|
|
|
For console:
CTRL_CLOSE_EVENT or the Console process termination message.
If you close the console from Taskmanager's "End Task", then you get the CTRL_CLOSE_EVENT notification.
The CTRL_CLOSE_EVENT message is sent as a signal that a console application should terminate.
BUT
If you click on "End Process" from task manager, then there's no way to handle it, in .NET or Win32.
The code below displays the message "Signal to quit was received" once you click on "End Task" from task manager.
<code></code>
#define STRICT 1
#include <windows.h>
#include <ctime>
#include <iostream>
using namespace std;
bool GlobalQuit = false;
BOOL WINAPI CtrlHandler(DWORD fdwCtrlType) {
switch (fdwCtrlType) {
case CTRL_C_EVENT:
Beep(1000, 1000);
case CTRL_CLOSE_EVENT:
case CTRL_BREAK_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
system("Color 1A");
cout << "Signal to quit was received\n";
GlobalQuit = true;
return TRUE;
default:
return FALSE;
}
}
int main(int argc, char *argv[], char *envp[]) {
struct tm *today;
time_t ltime;
char *p;
SetConsoleCtrlHandler(CtrlHandler, TRUE);
while (!GlobalQuit) {
time(<ime);
today = localtime(<ime);
p = asctime(today);
Sleep(2000);
}
return 0;
}
modified on Friday, April 30, 2010 12:01 PM
|
|
|
|
|