|
You're probably best off overriding CWinApp 's ExitInstance method? That should be called whatever (standard) mechanism you use to exit the application.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Thanks for the feedback, it does work to call ExitInstance(). I think the answer is yes but I no longer need to post message to WM_CLOSE window as I was doing before, it workS without the call but just wanted to make sure that nothing else is needed inside the ExitInstance when it is called other than my own code.
|
|
|
|
|
TimmySRX wrote: but just wanted to make sure that nothing else is needed inside the ExitInstance
Then call the base implementation also. It's the only way to be sure.
This code is taken from the documentation for ExitInstance (You do read those, I hope?)
int CMySampleApp::ExitInstance()
{
if ( m_pMySampleMem )
delete m_pMySampleMem;
DoCleanup();
return CWinApp::ExitInstance();
}
This is good practise for any MFC thing you override. You don't always want to do it, but you should make a conscious decision about it.
Iain.
Codeproject MVP for C++, I can't believe it's for my lounge posts...
|
|
|
|
|
(I've now spent the last 2½ hours trying to get this to work. I've read something like 60 pages on google.).
I'm trying to get the SendKeys for C++ to work, but to no avail.
I have tried what I think is all possible variations of SendKeys.h, windows.h, StdAfx.h and "#define _WIN32_WINNT 0x0501" (I have seen 0x0501, 500, 400, 401, 503, 510... Everyone says that what they say work. Well... no.). I simply cannot include that INPUT object (error C2065: 'INPUT' : undeclared identifier).
I am quite certain that all I need is to have ~5 rows of code in the right place. Which are these codes, and in which order should they be?
I'm using Visual C++ 6.0 (I also have the 2008 version available) with Windows XP SP2.
Now, I suppose you are supposed to do something like this:
1. Create a win32 project in visual c++ 6.0
2. Add a main.cpp file which has the main function in it
3. Add the SendKeys.cpp, StdAfk.cpp, SendKeys.h, StdAfx.h and resource.h files to the project (right-click -> add files to folder?)
4. Write something weird at the very beginning of StdAfx.h
5. Include the right things in my main.cpp
6. Create the main function, then create a CSendKeys object and then use it
7... here on, I could probably follow the official guide.
Which of the above is wrong?
|
|
|
|
|
Ran4 wrote: 4. Write something weird at the very beginning of StdAfx.h
ROTFLMAO Yeah that's the technical term for it!
Ran4 wrote: Which of the above is wrong?
You are, you're the one that's wrong. You apparently believe you should be able to create software without actually knowing what you are doing. I hope you don't find yourself in the hands of some surgeon that thinks the same way.
|
|
|
|
|
Huh? What are you talking about? What do you get out of being rude?
I want to create a program, something is in the way of that (this problem), and this is a place where I can hopefully learn how to do it. Learning your compiler is nearly impossible without someone helping you, as you know yourself.
|
|
|
|
|
Well, I should admit: learning led mike's compiler is troublesome...
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
modified on Monday, March 2, 2009 4:28 PM
|
|
|
|
|
SendKeys is for the .Net platform.
You should be using SendInput .
«_Superman_»
I love work. It gives me something to do between weekends.
|
|
|
|
|
I struggled a bit with SendInput, (which you should prefer to use) and I learned the following...
in the MSDN documentation, the call to SendInput must include a size of your input structure.
If you get it wrong, SendInput will do nothing, and not tell you.
Try something like...
<br />
#include <WinAble.h><br />
<br />
#define _MAX_KBDINPUT_LENGTH_ 50<br />
<br />
INPUT KBa[ _MAX_KBDINPUT_LENGTH_ ];<br />
::ZeroMemory(KBa, sizeof(KBa));<br />
<br />
UINT KBn = 0;
<br />
Stuff the KBa array with KEYEVENTF_KEYUP and KEYEVENTF_KEYDN (0) messages. like this...<br />
<br />
KBa[KBn].type = INPUT_KEYBOARD;<br />
KBa[KBn].ki.wVk = wVk;<br />
KBa[KBn].ki.wScan = wScan;<br />
KBa[KBn].ki.dwFlags = 0;
KBn++;<br />
KBa[KBn].type = INPUT_KEYBOARD;<br />
KBa[KBn].ki.wVk = wVk;<br />
KBa[KBn].ki.wScan = wScan;<br />
KBa[KBn].ki.dwFlags = KEYEVENTF_KEYUP;<br />
KBn++;<br />
<br />
Then, set focus to the target window. If its not a window your process owns, you must do the following<br />
<br />
DWORD tWNDthread = ::GetWindowThreadProcessId(hwndTARGET,0);<br />
if (!tWNDthread)<br />
{<br />
AfxMessageBox("zSendKeys FAILED to get ABF Thread Id!");<br />
bValid = FALSE;<br />
}<br />
<br />
BOOL bAttached = FALSE;<br />
bAttached = AttachThreadInput(GetCurrentThreadId(),tWNDthread,TRUE);
<br />
if ( bAttached )<br />
{<br />
::SetForegroundWindow(hwndTARGET);
::SetFocus(hwndTARGET);
<br />
AttachThreadInput(GetCurrentThreadId(),tWNDthread,FALSE);
<br />
} else<br />
{<br />
AfxMessageBox("zSendKeys FAILED to attach to ABF Thread Id!");<br />
bValid = FALSE;<br />
}<br />
<br />
if (bValid) bValid = ::SendInput(KBn,&KBa[0],sizeof(INPUT));
<br />
::SetForegroundWindow(hME);<br />
::SetFocus(hME);<br />
I know this is MFC-centric, and not generic C, but I hope it helps you
-Dave
|
|
|
|
|
For starters, you might as well use the deprecated keybd_event function.
«_Superman_»
I love work. It gives me something to do between weekends.
|
|
|
|
|
Hello,
I am trying to compile this small dll function and am getting a linking error can someone help....Please....I am using Visual Studio 2008.
The error i get when i build is error LNK2019: unresolved external symbol _DetourTransactionBegin@0 referenced in function _DllMain@12
Here is the code.
Can someone help..Please
#include "stdafx.h"
#include "detours.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
DetourTransactionBegin();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
DetourTransactionBegin();
break;
}
return TRUE;
}
thanks A Million.
|
|
|
|
|
Either add detours.cpp to your project (if you have it) or update your project settings to link to the library, perhaps named, detours.lib
|
|
|
|
|
Did you link to the appropriate library ? The one which defines the DetourTransactionBegin (possibly detour.lib ?)
|
|
|
|
|
yes under tools-> options -> vc++ directories i have both the directories..one under include and the other under lib....
|
|
|
|
|
That's not enough. You need to specify in your settings that you are linking with the library: "Project properties" -> "Linker" -> "Input" and in "Additional Dependencies" put the name of your library.
|
|
|
|
|
By the way, I prefer to set the include and lib directories in the project settings rather than in the options. The difference is that they will be specific to your project and not to visual studio. This has also the advantage that all the required information is contained in your project file that you can distribute with your sources.
|
|
|
|
|
same error message.....I have a project from someone with detours in it...and it compliled and did build fine with no errors or warnings..Thinking if its the way i started the new project..
|
|
|
|
|
Started a new project and once i add the detours.cpp i get this
1>------ Build started: Project: simpledll, Configuration: Debug Win32 ------
1>Compiling...
1>detours.cpp
1>e:\mydetour\simpledll\detours.cpp(22) : fatal error C1189: #error : Must define one of DETOURS_X86, DETOURS_X64, or DETOURS_IA64
1>Build log was saved at "file://e:\MyDetour\simpledll\Debug\BuildLog.htm"
1>simpledll - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
what did i miss....
If i remove the detours.cpp I get
1>------ Build started: Project: simpledll, Configuration: Debug Win32 ------
1>Compiling manifest to resources...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>Linking...
1>dllmain.obj : error LNK2019: unresolved external symbol _DetourTransactionBegin@0 referenced in function _DllMain@12
1>E:\MyDetour\simpledll\Debug\simpledll.dll : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://e:\MyDetour\simpledll\Debug\BuildLog.htm"
1>simpledll - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
|
|
|
|
|
By removing detours.cpp you remove the body of the function DetourTransactionBegin(..) and, though the project now compiles, the linker can't find it - the function body. But why remove detours.cpp in the first place?
Your first error is the one which you need to fix - and not by removing detours.cpp. You must define one of the possible values as the error message says. If you are not building for a 64 bit system it looks as if you need to add the code: #define DETOURS_X86 Though there may be slightly more to it...
|
|
|
|
|
I have tried everything I can possibly think of...Short of asking someone to actually complie it in a new project and tell me I am doing something wrong or is my setup of Visual studio thats the problem. If someone is willing to do that I am going to create a new project and write step by step instructions of what i pick and chose when making the project...could that be my problem?
I would really appreciate if someone tried to use this small detour function and be able to compile it using Visual Studio 2008.
PleasePlease..Help...
|
|
|
|
|
By all means try a new project, though I can't help out testing it I dont have VS available (long story).
Going back to the original #define error, did you try defining one of the values it asked for?
|
|
|
|
|
ok..i have a filling it's something to do with the project settings in visual Studio 2008.
Every search I have done for detours I get results with visual studio 2005.
I obviously had to use nmake to compile the detours. And a few changes in the _win32.cpp, I was able to compile the detours.
I created a new project, asked it to use the detours.lib and changed the setting to use precompiled headears. However doing that now i get an error
1>LINK : fatal error LNK1104: cannot open file '.\Debug\dllmain.obj'
I have a feeling I might have to get my hands on visual studio 2005.
Unless I have missed something...I am almost giving up on this.
|
|
|
|
|
Hey everybody,
Let's see if I have this code:
class R
{
public:
typedef void (*Method)();
Method onClick;
void Do()
{
(*onClick) ();
}
};
void ok()
{
printf("OK\r\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("main\n");
R r;
r.onClick = &ok;
r.Do();
...
Just runs. Function pointer works..
But if I try to point a NON-STATIC function of a class.. well cant do that! I need to pass class instance also.. But dunno if there's a way to do that without templates.
So any idea how to do that without using template?
To make it clear:
class A
{
public:
void run(void);
};
class R
{
public:
typedef void (*Method)();
Method onClick;
void Do()
{
(*onClick) ();
}
};
void ok()
{
printf("OK\r\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("main\n");
A a;
R r;
r.onClick = &a.run;
r.Do();
...
|
|
|
|
|
There is a difference between a regular function pointer as you have declared in R, and a "pointer to a member function," which is what you want in the last code example.
The syntax is quite cryptic, and I don't recall what it is, but if you search for "pointer to member function," I'm sure you'll come up with it.
|
|
|
|
|
A non-static method pointer is the same as any function pointer that needs parameters - you need to tell the caller what those parameters are.
So, you could do this:
class R
{
public:
typedef void (A::*Method)();
struct MethodCall { Method fn; A obj; };
MethodCall onClick;
void Do()
{
Method m = onClick.fn;
A& a = onClick.obj;
((a).*(m))();
}
};
int main(int argc, char* argv[])
{
A a;
R r;
r.onClick.obj = a;
r.onClick.fn = &A::run;
r.Do();
}
But then if you wanted to use ok as a handler as well, you'd need to add a separate data member for that.
Getting around all that is the raison d'etre for Boost.Function[^] (also in std::tr1::function in VC2008, I believe). With that (and a smidgen of Boost.Lambda[^]), I'd write your onClick handler like this:
#include <iostream>
#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
class A
{
public:
void run(void) { std::cout << "A::run\n"; }
};
class R
{
public:
boost::function<void()> onClick;
void Do()
{
onClick();
}
};
void ok()
{
std::cout << "ok\n";
}
int main(int argc, char* argv[])
{
A a;
R r;
r.onClick = ok;
r.Do();
using namespace boost::lambda;
r.onClick = bind(&A::run, var(a));
r.Do();
}
If you then want multiple handlers, Boost.Signals[^] is very useful as well!
[edit]It would be remiss of me not to point out that Boost.Function is compatible with the STL binders such as mem_fun[^] - but as Boost.Lambda is so much cooler, I hope you'll forgive me [/edit]
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|