|
Check if your CFormview still owns the scrollbar. If not, no scrolling.
Also there is a bug in MFC 7.1 and 8.0 which can cause this behaviour. If all else fails implement your own ::OnMouseWheel.
|
|
|
|
|
Normally the View should scroll by default. Mostly you have such problem when you have some control over the form, you will need to handle Scroll messages in the control in this case.I can scroll with the wheel in a CFormView application. If no controls is placed in your form too, then I suggest you to try your application on a different machine, see if there is any changes?
|
|
|
|
|
in my Pocket PC (MFC VS2009) app, I am trying to open/read a txt file, but most of the read file commands are not included. The only one seems to work for me is ReadFile, which is not that easy to use if I want to read lines of text.
Any ideas?
|
|
|
|
|
Please get and try the class on the bottom of the article[^]
virtual void BeHappy() = 0;
|
|
|
|
|
|
Software2007 wrote: Any ideas?
Can you use fopen() and fscanf() ?
"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 got DLL injection example from youtube. http://www.youtube.com/watch?v=H3O3hmXkt1I
For some reason it says: "Injection failed" (under indows 7) and under win xp this exe doesn't even start (i see msgbox telling me to reinstall this app).
It compiles w/o errors
Injector.exe
#include <iostream><br />
#include <direct.h><br />
#include <windows.h><br />
#include <tlhelp32.h><br />
using namespace std;<br />
<br />
char* GetCurrentDir()<br />
{<br />
char* szRet = (char*)malloc(MAX_PATH);<br />
<br />
_getcwd(szRet, MAX_PATH);<br />
<br />
return szRet;<br />
}<br />
<br />
LPCTSTR SzToLPCTSTR(char* szString)<br />
{<br />
LPTSTR lpszRet;<br />
size_t size = strlen(szString)+1;<br />
lpszRet = (LPTSTR)malloc(MAX_PATH);<br />
mbstowcs_s(NULL,lpszRet,size,szString,_TRUNCATE);<br />
return lpszRet;<br />
}<br />
<br />
void WaitForProcessToAppear(LPCTSTR lpcszProc, DWORD dwDelay)<br />
{<br />
HANDLE hSnap;<br />
PROCESSENTRY32 peProc;<br />
BOOL bAppeared = FALSE;<br />
<br />
while (!bAppeared)<br />
{<br />
if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)) != INVALID_HANDLE_VALUE)<br />
{<br />
peProc.dwSize = sizeof(PROCESSENTRY32);<br />
if(Process32First(hSnap, &peProc))<br />
while(Process32Next (hSnap, &peProc) && !bAppeared)<br />
if(!lstrcmp(lpcszProc, peProc.szExeFile))<br />
bAppeared = TRUE;<br />
}<br />
CloseHandle(hSnap);<br />
Sleep(dwDelay);<br />
}<br />
}<br />
<br />
DWORD GetProcessIdByName(LPCTSTR lpcszProc)<br />
{<br />
HANDLE hSnap;<br />
PROCESSENTRY32 peProc;<br />
DWORD dwRet = -1;<br />
<br />
if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)) != INVALID_HANDLE_VALUE)<br />
{<br />
peProc.dwSize = sizeof(PROCESSENTRY32);<br />
if(Process32First(hSnap, &peProc))<br />
while(Process32Next (hSnap, &peProc))<br />
if(!lstrcmp(lpcszProc, peProc.szExeFile))<br />
dwRet = peProc.th32ProcessID;<br />
}<br />
CloseHandle(hSnap);<br />
return dwRet;<br />
}<br />
<br />
BOOL InjectDLL(DWORD dwPid, char* szDllPath)<br />
{<br />
DWORD dwMemSize;<br />
HANDLE hProc;<br />
LPVOID lpRemoteMem, lpLoadLibrary;<br />
BOOL bRet = FALSE;<br />
<br />
if((hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_CREATE_THREAD, FALSE, dwPid)) != NULL)<br />
{<br />
dwMemSize = strlen(szDllPath) +1;<br />
if((lpRemoteMem = VirtualAllocEx(hProc,NULL,dwMemSize,MEM_COMMIT,PAGE_READWRITE)) != NULL)<br />
if(WriteProcessMemory(hProc, lpRemoteMem, (LPCVOID)szDllPath,dwMemSize,NULL))<br />
{<br />
lpLoadLibrary = GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");<br />
if(CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)lpLoadLibrary, lpRemoteMem, 0, NULL) != NULL)<br />
bRet = TRUE;<br />
}<br />
}<br />
CloseHandle(hProc);<br />
<br />
return bRet;<br />
}<br />
<br />
int main()<br />
{<br />
char szProc[MAX_PATH],szDll[MAX_PATH];<br />
char* szDllPath = (char*)malloc(MAX_PATH);<br />
LPTSTR lpszProc = NULL;<br />
for(;;)<br />
{<br />
cout << "Proccess: ";<br />
cin >> szProc;<br />
cout << "DLL: ";<br />
cin >> szDll;<br />
szDllPath = GetCurrentDir();<br />
strcat_s(szDllPath,MAX_PATH,"\\");<br />
strcat_s(szDllPath,MAX_PATH,szDll);<br />
cout << "Waiting for process..." << endl;<br />
WaitForProcessToAppear(SzToLPCTSTR(szProc), 100);<br />
if(InjectDLL(GetProcessIdByName(SzToLPCTSTR(szProc)),szDllPath))<br />
cout << "Injection succeeded!" << endl;<br />
else<br />
cout << "Injection failed!" << endl;<br />
cout << "\n";<br />
}<br />
<br />
return 0;<br />
}
test.dll
#include <windows.h><br />
<br />
BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved)<br />
{<br />
switch(dwReason)<br />
{<br />
case DLL_PROCESS_ATTACH:<br />
MessageBox(0, L"I'm injected!",L"injxOrz", MB_OK);<br />
}<br />
<br />
return TRUE;<br />
}
any ideas?
|
|
|
|
|
Try to run the code with administrator privileges.
|
|
|
|
|
>Try to run the code with administrator privileges.
still fails.
Does that code work for you?
|
|
|
|
|
You should try to debug it and find out what fails exactly.
|
|
|
|
|
try setting debug priviledges
|
|
|
|
|
whats the debug privileges?
In youtube tutorial is used win xp but i hav win 7, would that be a problem?
if i debug variables to console i will probably get just some numbers that doesn't say any thing for me but, I will try it.
edit1: why doesn't this exe run on win xp?( copied binary (didn't recompile it))
"This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem"
in win 7 it runs but doen't inject.
modified on Tuesday, April 20, 2010 3:04 PM
|
|
|
|
|
Why don't you give us something to go on? How far does execution get? If something fails, are any error being returned? What are the errors? Has the code ever worked? Is something catching fire?
Steve
|
|
|
|
|
i think OpenProcess need just PROCESS_ALL_ACCESS, that is enough.
Please check whether it is failing on that location
Check this article API Hooking (LoadLibrary)[^] for more info.
Величие не Бога может быть недооценена.
|
|
|
|
|
>Why don't you give us something to go on? How far does execution get? If something fails, are any error being returned? What are the errors? Has the code ever worked? Is something catching fire?
Proccess: inject.exe
DLL: test.dll
Waiting for process...
Injection failed!
Proccess:
http://autoit.pri.ee/downloads/dllinject.zip
>i think OpenProcess need just PROCESS_ALL_ACCESS, that is enough.
>Please check whether it is failing on that location
'I tried that, same result as above
|
|
|
|
|
Hi,
I was wondering when using a operator
such as "+" in order to be invoked does the
code being executed have to be part of
that class where the operator was defined or
with regards for example a "+" operator
if one the operands is of a type where
the operator has been defined then the
opertor code will get invoked. So.....
CString + (LPSTR) invoked in any method
of any class will execute the CString operator +
code
thankx
|
|
|
|
|
hmmm... not certain I understand correctly, but ...
If there's an operator defined for a class it will be called when it is referenced in the code; if the types are not allowable then the compiler will report an error (or warning).
In you example, there is an operator that allow the operator+ between a CString and a L(C)PSTR.
friend CStringT operator+(
const CStringT& str1,
PCXSTR psz2
);
Watched code never compiles.
|
|
|
|
|
Normally when you overload an operator in a class, the left has side operand is taken as the caller.
So assume you have operator + overloaded in class A .
Consider the following code -
Class A
{
public:
void operator +(int i) {}
};
int main()
{
A Obj;
Obj + 3;
}
Here the operator call is going to be converted to Obj.operator+(3);
But if you write 3 + Obj it will fail because it becomes 3.operator+(Obj) which is illegal in C++.
Because of this what is normally done is to create two global functions of the forms -
void operator +(const A& obj, int i);
void operator +(int i, const A& obj);
Then these 2 operators are declared as friend functions of the class A so that the functions can access all members of the class A .
|
|
|
|
|
To define an operator out side of a class, you place "friend" before the return type.
class A {
public:
A(int x) :num(x) {}
~A() {}
int GetVal() {return num;}
friend std::ostream& operator<<(std::ostream& o,A& a) {return o << a.GetVal();}
private:
int num;
};
Which is the same as:
class A {
public:
A(int x) :num(x) {}
~A() {}
int GetVal() {return num;}
private:
int num;
};
std::ostream& operator<<(std::ostream& o,A& a) {return o << a.GetVal();}
modified on Tuesday, April 20, 2010 5:55 PM
|
|
|
|
|
Gwenio wrote: To define an operator out side of a class, you place "friend" before the return type.
Only when the 'outside' (i.e. global namespace's) operator (like any other global namespace method) needs to access class protected or private members.
Gwenio wrote: or you might do it like this (have not tried, but is should work):
class A {
public:
A(int x) :num(x) {}
~A() {}
int GetVal() {return num;}
private:
int num;
};
friend std::ostream& operator<<(std::ostream& o,A& a) {return o << a.GetVal();}
Why do you think it works?
I doesn't, of course.
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]
|
|
|
|
|
I CString is defined as a friend to most of the MFC class which take strings as arguments
|
|
|
|
|
And so?
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]
|
|
|
|
|
This is a part 2 on a question i posted earlier on this forum. The problem:
In a Keydown handler, when a user pressed the VK_MENU key an editbox is created. So far so good. Problem is that the standard behaviour of windows for a KEYUP-message of this key is to open a context menu. I was suggested:
1) to create the editbox in the keyup handler. This is not an option.
2) to swallow the keyup-message. This sounds good.
My question: how to swallow the keyup message? Is it setting up a local message dispatcher that dispatches messages till the keyup event comes in view, and then just trow it away? What happens to the keyboardstate then? I'm using C. A light on the right approach would be welcome...
Rozis
|
|
|
|
|
If you're fixated on WM_KEYDOWN, rather than WM_KEYUP, you have another problem to consider. When someone holds down a key, you get multiple down messages, followed by a single up message.
Are you requiring someone to hold down the menu button? If not, what's wrong with using the UP message? If you are requiring they hold down this button, then a) typing will be hard, and b) you could use the up button to dismiss your edit box.
Answering your question more directly, if you can handle the down message, can't you just handle the up message with 99% identical code:
case WM_KEYDOWN:
if (wParam == VK_MENU)
DoSomething ();
else
DoAnotherThing ();
break;
case WM_KEYUP:
if (wParam == VK_MENU)
;
else
DoYetAnotherThing ();
break;
You say you're using C, so I assume some win32 code stuff.
Yours trying to help but puzzled why your tying your shoe laces together,
Iain.
I have now moved to Sweden for love (awwww).
|
|
|
|
|
I've been curious and looked at your previous question.
I've made a small app, and it has an edit box.
Both right clicking in the edit box, and pressing the menu key end up generating a WM_CONTEXTMENU message. *This* is what pops up the menu.
You could subclass the edit window in question, and handle the WM_CONTEXTMENU message for that window. Handle it by doing very little.
The details of how you do that vary a lot depending on what programming framework you are using.
Iain.
I have now moved to Sweden for love (awwww).
|
|
|
|
|