|
You can use a kernel mode synchronization object, i.e. event or mutex. You can also use a semaphore and set the max count to 1 and it will act like a mutex but then why not use a mutex.
Basically what you need to do is acquire the event or mutex in the code updating the file so that no one else can get it. After the object is acquired you start the monitor thread and attenpt to obtain the object in that thread. The monitoring thread will block and not be eligable for scheduling again until the object is acquired which will not happen until the file process thread releases it after making an update to the file. After a short wait, 1 or even 0 microseconds, to insure the file processing thread gives up the remainder of it's timeslice thus insuring that the object is acquired by the waiting file monitoring thread, attempt to obtain the object again in the file processing thread.
The file monitor then wakes up, does what it does and releases the object so that the file processing thread can get it again. Since the file processing thread is queued up to get the object you can try to acquire the object again in the monitoring thread after a short wait so that the monitoring thread gives up the remainder of it's time slice to insure that the file processing thread will obtain the object. In this way the monitoring thread will be blocked and not using CPU cycles until it comes to life when the file processing thread releases the object.
This will work even if the file processing thread is in a different process than the monitoring thread. Note that all the threads have to be executing at the same dispatch priority for this logic to work properly.
The important thing to remember is to relinquish the remainder of the threads time slice before trying to acquire the object again thus insuring that the other thread is able to get the object.
If more than two threads are involved in the logic you will need to use a memory mapped file or additional, uniquely named, kernel mode synchronization object(s) to exchange state information between processes so that they know when to attempt to obtain the object.
You will have to insure that the object name is unique between all processes so it is best to use either the guidgen or uuidgen programs to generate a unique identifier for use in the object's name. I would also include a user friendly prefix or suffix so if you use a spy program to debug the interaction between these threads you will be able to recognize the the object by it's name.
|
|
|
|
|
I want to have a window creation (through the WinAPI) in the dll. Looks so:
class SX_API SXWindow{
protected:
//Class variables
HINSTANCE hInst;
WNDCLASS WndClass;
HDC hDC;
HWND hWindow;
//User variables
char *szWindowTitle;
SX_BOOL bFullscreen;
SX_UINT nWidth;
SX_UINT nHeight;
SX_UINT nBpp;
public:
static SXWindow* GetMain();
LRESULT CALLBACK MessWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
SX_BOOL SetState(sxEnum State, char *szValue);
SX_BOOL SetState(sxEnum State, int nValue);
void *GetState(sxEnum State);
SX_BOOL Show();
SX_BOOL Create();
SX_BOOL Run();
void Destroy();
SXWindow();
~SXWindow();
};
In the main file the user may only start Create, Show and Run functions.
But here is a problem: when the application starts there is no any window on the screen, but the process is in the memory.
Global function that inserts window class pointer into WL_USERDATA.
When any other message receives it gets the pointer to the class and call class message handler function.
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg == WM_CREATE)
{
SetWindowLong(hWnd, GWL_USERDATA, (LONG)(((CREATESTRUCT*)lParam)->lpCreateParams));
return 0;
} else
{
return
((SXWindow*)GetWindowLong(hWnd, GWL_USERDATA))->MessWndProc(hWnd, uMsg, wParam, lParam);
}
}
Here is the window creation function:
SX_BOOL SXWindow::Create()
{
hInst = (HINSTANCE)GetModuleHandle(NULL);
WndClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
WndClass.lpfnWndProc = (WNDPROC)WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInst;
WndClass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(NULL));
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = NULL;
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = "SXWindowClass";
if(!RegisterClass(&WndClass))
{
SXCore::GenError(SX_ERROR_FAILED, "RegisterClass()");
return SX_FALSE;
}
DWORD windowStyle = WS_OVERLAPPEDWINDOW;
DWORD windowExStyle = WS_EX_APPWINDOW;
if(bFullscreen)
{
ShowCursor(FALSE);
windowStyle = WS_POPUP;
windowExStyle |= WS_EX_TOPMOST;
} else
{
RECT WndRect;
WndRect.right = nWidth;
WndRect.bottom = nHeight;
AdjustWindowRectEx (&WndRect, windowStyle, 0, windowExStyle);
windowExStyle |= WS_EX_WINDOWEDGE;
}
hWindow = CreateWindowEx(windowExStyle, "SXWindowClass",
szWindowTitle,
windowStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
0, 0, nWidth, nHeight,
NULL, NULL, hInst, this);
if(hWindow == NULL)
{
SXCore::GenError(SX_ERROR_FAILED, "CreateWindowEx()");
return SX_FALSE;
}
//Getting window DC
hDC = GetDC(hWindow);
if(hDC == NULL)
{
SXCore::GenError(SX_ERROR_FAILED, "GetDC()");
return SX_FALSE;
}
return SX_TRUE;
}
And other functions:
LRESULT CALLBACK SXWindow::MessWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE: PostQuitMessage(0); break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
SX_BOOL SXWindow::Show()
{
if(hWindow != NULL)
{
ShowWindow(hWindow, SW_SHOW);
return SX_TRUE;
}
return SX_FALSE;
}
SX_BOOL SXWindow::Run()
{
MSG msg;
BOOL done = FALSE;
while(!done)
{
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return SX_TRUE;
}
The main file:
#include <windows.h>
#include <sxcore.h>
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)
{
SXCore::GetMainWindow()->SetState(SX_WINDOW_TITLE, "TestApp");
SXCore::GetMainWindow()->SetState(SX_WINDOW_FULLSCREEN, SX_FALSE);
SXCore::GetMainWindow()->Create();
SXCore::GetMainWindow()->Show();
SXCore::GetMainWindow()->Run();
SXCore::GetMainWindow()->Destroy();
return 0;
}
There are no any error messages, but there is no window on the screen. Where the error can be ?
|
|
|
|
|
Hi,
I'm having a problem opening a file. GetFileName() doesn't seem to give me a name. If I open a file, the dialog appears, I select a file and my code returns a blank message box and then a messagebox with no error happened.
I'm kinda new to all this MFC stuff (and my C++ skill isn't that good) so I really don't know what's wrong.
if( FileDlg().DoModal() == IDOK )
{
CFileException ex;
if( f.Open(FileDlg().GetFileName(), CFile::modeRead) == FALSE )
{
AfxMessageBox(FileDlg().GetFileName());
TCHAR szError[1024];
ex.GetErrorMessage(szError, 1024);
AfxMessageBox(szError);
return;
}
AfxMessageBox("OK");
CArchive test(&f, CArchive::load);
CLoader2Doc::Serialize(test);
}
else
return;
f.Close();
|
|
|
|
|
How is FileDlg() declared? Unless it's a reference to an existing file dialog object, I doubt it's going to give you the results you expect. It sounds like you're getting a freshly constructed CFileDialog object each time you call FileDlg() , which would return a blank filename.
The conventional way to do this sort of thing is as follows:
CFileDialog dlg(TRUE);
if (dlg.DoModal() == IDOK) {
try {
CFile f(dlg.GetPathName(),CFile::modeRead);
while (f.Read(...)) {
}
}
catch (CFileException *e) {
e->ReportError();
e->Delete();
}
} Some notes on the snippet of code:
- You can add arguments to the CFileDialog constructor to specify the default file extension, filename, and so on.
- Embedding all of the file operations in the try/catch block lets you handle any problems with the file access in one place.
- The two-argument constructor for the CFile object opens the file. The CFile destructor will automatically close the file when the f object goes out of scope.
- The ReportError() method provided by the CFileException object displays an appropriate error message for you. The nice thing here is, you get the standard Windows error messages, appropriate to the type of error, and they're in the language of the user.
Software Zen: delete this;
|
|
|
|
|
Thx a lot! I did indeed forgot to declare it, stupid me
|
|
|
|
|
how can I hide a file but without making it's attributes to invisible.
gabby
|
|
|
|
|
|
use fantasy...
- put in on a http server, download it from there on demand?
- put it into a resource dll, load the dll on demand and get the data?
- recreate file as JPG which has your data as payload in the JPG-comment section?
But sounds all like script kiddie solutions, I would simply do NOT hide the file and encrypt it... or tell your g/f to not use your login.
|
|
|
|
|
The EN_CHANGE notification message is sent when the user has taken an action that may have altered text in an edit control. Unlike the EN_UPDATE notification message, this notification message is sent after the system updates the screen. The parent window of the edit control receives this notification message through a WM_COMMAND message.
This is written in the MSDN.
so i 've made a callback function in my w32 api for the dialog that contains the Edit Control like this:
long FAR PASCAL fereastra1(HWND hdlg1,WORD wmessage1,WPARAM wparam1,LPARAM lparam1)
{
switch(wmessage1)
{
case WM_COMMAND:
switch (wparam1)
{
case IDC_LIST1:
switch(lparam1)
{
case 0x0300:
MessageBox(NULL,"modified","HGabby",MB_OK);
break;
case EN_UPDATE:
MessageBox(NULL,"modified","HGabby",MB_OK);
break;
}
case IDOK:
EndDialog(hdlg1,0);
break;
}
break;
}
return 0;
}
can you tell me please how should I handle this problem
When I do it in mfc it works. I mean each time I modifi the edit box a message box appears. I want to do it in a w32 api. so please help me
thankx
gabby
|
|
|
|
|
Add one more break to your code.
It should work now.
long FAR PASCAL fereastra1(HWND hdlg1,WORD wmessage1,WPARAM wparam1,LPARAM lparam1)
{
switch(wmessage1)
{
case WM_COMMAND:
{
switch (wparam1)
{
case IDC_LIST1:
{
switch(lparam1)
{
case 0x0300:
MessageBox(NULL,"modified","HGabby",MB_OK);
break;
case EN_UPDATE:
MessageBox(NULL,"modified","HGabby",MB_OK);
break;
}
}
break;
case IDOK:
EndDialog(hdlg1,0);
break;
}
break;
}
return 0;
}
|
|
|
|
|
This is a working code:
LRESULT CALLBACK wndproc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
else if(LOWORD(wParam) == IDC_EDIT1)
{
switch(HIWORD(wParam))
{
case EN_CHANGE:
MessageBox(NULL,"EN_CHANGE","Edit Notify",MB_OK);
return TRUE;
case EN_UPDATE:
MessageBox(NULL,"EN_UPDATE","Edit Notify",MB_OK);
return TRUE;
}
}
break;
}
return FALSE;
}
____________________
A.M.
|
|
|
|
|
I have written an NT service that starts automatically when the system boots. It seems to work fine until I set the machine to go into stand-by mode after a specified period of time and eventually power down the monitor and disk drives after an additional specified time.
I have had successful test runs of 5+ hours without any apparent difficulty but when I changed the settings to the ones mentioned above I get an access violation in MSVCRT.DLL (not my dll). The information message gives me an instruction address in the MSVCRT.DLL and some target address saying that the memory could not be written.
Although the service still indicates that it is running, in the Administrative Tools ==> Services dialog, it is dead in the water, as indicated by an application progress log. Additionally I cannot attach a debugger to it. Not being able to attach a debugger to the process limits the definitive information I can gather about this point of failure.
What I suspect is happening is that the monitor powers down due to prolonged inactivity. I do not think the disks are also powered down at this point because the service is still running or if the service was suspended when the system went into stand-by mode some specified time before the monitor power down is initiated. In either case the disks would power down after the monitor because inactivity would have occured in the monitor some time before the system actually went into stand-by mode or prolonged disk inactivity. From here I am just guessing but it seems, from the name of the dll, like the service is trying to access a buffer associated with the monitor which has been freed when the monitor initiated a power down or power up sequence.
The file version of MSVCRT.DLL is 7.0.2600.2180 (xpsp_sp2_rtm.040803-2158).
My question is if anyone knows of a way to get signeled when the machine makes the transition to/from stand-by or hibernate modes, and when the monitor or disks initiate a power down or power up sequence.
If the process can be signaled then it can be put into a paused state until the machine and\or monitor and disks wake up again and should be able to continue processing.
|
|
|
|
|
i think you are looking for winlogon notification package.
there is very good article over it in CP,search Winlogon at CP
-----------------------------
"I Think It Will Help"
-----------------------------
Alok Gupta
visit me at http://www.thisisalok.tk
|
|
|
|
|
Thank you for the response. It made interesting reading for future reference but Winlogon.exe doesn't expose the events I am looking for.
I need to find a similar program that exposes system transitions to/from stand-by and hibernate, as well as the monitor and disks powering down and up again.
|
|
|
|
|
I think this is what youw ere ater originally...
Your service needs to be written with HandlerEx instead of just handler.
Then you should get the SERVICE_CONTROL_POWEREVENT control code.
"A HandlerEx function is an application-defined callback function used with the RegisterServiceCtrlHandlerEx function. A service program can use it as the control handler function of a particular service."
"If dwControl is SERVICE_CONTROL_POWEREVENT, this parameter can be one of the values specified in the wParam parameter of the WM_POWERBROADCAST message."
"WM_POWERBROADCAST - Power-management event. This parameter can be one of the following events. Event Meaning
PBT_APMBATTERYLOW Battery power is low.
PBT_APMOEMEVENT OEM-defined event occurred.
PBT_APMPOWERSTATUSCHANGE Power status has changed.
PBT_APMQUERYSUSPEND Request for permission to suspend.
PBT_APMQUERYSUSPENDFAILED Suspension request denied.
PBT_APMRESUMEAUTOMATIC Operation resuming automatically after event.
PBT_APMRESUMECRITICAL Operation resuming after critical suspension.
PBT_APMRESUMESUSPEND Operation resuming after suspension.
PBT_APMSUSPEND System is suspending operation."
|
|
|
|
|
Excellent!
These are the events I need to monitor.
I am assuming that in order to hibernate the machine will give some of these events also, probably the request to suspend. I can figure that out easily in unit test.
Thank you
JimmyRopes
|
|
|
|
|
I write program to comunicate by Serial Port. I use the event comunication.
While i use the program, sometime, the directory of PC go in stall.
Why?
And other pbm: With only windows Xp i lose the communication.
thank you very much
Joshua
|
|
|
|
|
Hello,
I am working with CFile in MFC. I want to set attributes of this file in such a way that one application can read data from it while the other application is writing data to it. Can anyone please help me to do this?
Thanks
Madhavi
|
|
|
|
|
Hi,
try this method
file Write Application
------------------
CFileStatus Status;
CFile oFile;
oFile.GetStatus ("yourFile.txt),status);
if ( status.m_attribute == readonly )
{
status.m_attribute = write
oFile.SetStatus(("yourFile.txt),status);
//Write to your file code goes from here
//change Status to Back to Readonly
status.m_attribute = readonly;
oFile.SetStatus(("yourFile.txt
}
Read Applicatio]n
-----------------------------------
use Open Readonly Mode Method
OR You Can Use Inter process communication ,it's a better solution rather than first one
by
baijumax
|
|
|
|
|
The attributes shown bellow are for already created file.
Reading app: CFile::modeRead|CFile::shareDenyRead .
Writing app: CFile::modeWrite|CFile::shareDenyWrite .
|
|
|
|
|
How can I repaint only part of a dialog box? I have a dialog that pops up while my program searches files, and I want to update the current file (like install programs do). I use a static text, but when the dialog is shown only the static text that is being updated is show, there is a "hole" where the button and two other static text objects are. Any ideas? Thanks!
|
|
|
|
|
you have to use some logic to solve your problem,
tell me the dialog which you popup is Modeless or model.
if Modeless,do a interprocess comunication by sending & recieving message and every time when you recive the message update the window.
or you send me the code i will do for you,but pls send a proper documentaion with it
-----------------------------
"I Think It Will Help"
-----------------------------
Alok Gupta
visit me at http://www.thisisalok.tk
|
|
|
|
|
|
i tried to link Matlab engine with VC++ 6. I got the following error
engwindemo.c
Linking...
MSVCRT.lib(crtexe.obj) : error LNK2001: unresolved external symbol _main
Debug/engwindemo.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
engwindemo.exe - 2 error(s), 0 warning(s)
can anyone help me
|
|
|
|
|
Hi,i want to create a combo box and map a function to it.the function need be called according to the selection os the item in the list.Kindly send me simple samples.(note: i am in the incipient stages of learning this)
Prathiba
|
|
|
|
|