|
As you pointed out, the OP code looked a bit confused.
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
CPallini wrote: a bit confused I assumed that was just me.
|
|
|
|
|
OK, now I experience another issue with it, I'm sorry.
Hopefully you can help me here as well.
I now want to call the callback function if an timer expires. Therefore I create an timer in a function I call from the main application. I store the handles to the timer and the timer queue globally in static variables.
static HANDLE gDoneEvent;
static HANDLE hTimer = NULL;
static HANDLE hTimerQueue = NULL;
int arg = 123;
VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
if (lpParam == NULL)
{
return;
}
else
{
if(s_user_function!=nullptr)
s_user_function(12);
}
}
Now, in some function called from the main application, I allocate the timer and start it:
char timer_init(void)
{
gDoneEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (NULL == gDoneEvent)
{
return 1;
}
hTimerQueue = CreateTimerQueue();
if (NULL == hTimerQueue)
{
return 2;
}
CreateTimerQueueTimer(&hTimer, hTimerQueue, (WAITORTIMERCALLBACK)TimerRoutine, &arg, 3000, 10000, 0);
WaitForSingleObject(gDoneEvent, INFINITE);
}
As you can see, I don't close the handles and delete the timer queue on purpose.
Everything works fine as long as the process waits. The callback in the main application is called.
If I comment out the line with WaitForSingleObject I'll get an access exception, although I stored all the handles globally. Teh exception occurs with the timing the timer would have. So most likely it tries to call the callback of the timer function but something is missing.
What is it I'm overlooking?
I need the dll running, not waiting inside a fucntion for a timer...
|
|
|
|
|
Bodo2407 wrote: I need the dll running, not waiting inside a fucntion for a timer.. I am not sure what you mean by that. When you create a timer, it is designed to call some function after a specified period of time, either once or repeatedly. The reason for having the call to WaitForSingleObject , is in case the main code needs the timer event to complete some action first. But it is not necessary if the remainder of the code does not rely on the actions of the timer event.
|
|
|
|
|
Hi Richard,
yes, I know that. I did put that in, because I got the exception and wanted to try the example code. This worked two times, so I thought it must be caused by leaving the function. Unfortunately thsi is not the case:
After some debugging runs it seems that (in rare cases) it works a few times, but most likely it crashes immediately. So the observation I made that it is working if I call WaitForSingleObject isn't correct, it can crash randomly with or without.
Unfortunately when it crashs the program pointer isn't on frame any more, so I don't see why it does that.
One observation I made is that the handle of gDoneEvent is allocated in an entirely different address room (0x000003b0) than the other two handles hTimer and hTimerQueue(0x008b8928 and 0x008bsomething) which seems strange to me, since I thought allocated event should be also pretty close to the handles, but obviously it is not.
modified 16-Apr-21 11:04am.
|
|
|
|
|
Those numbers do not mean anything, except to the operating system.
|
|
|
|
|
Problem 1 — Flawed MAC designs (11 marks) For this problem, you need to carefully trace through the given MAC algorithms, and
|
|
|
|
|
No idea what that is supposed to be. Maybe you lost connection while typing.
|
|
|
|
|
You never asked a question, but based on what other people are doing lately, it seems you're just trying to post your homework assignment from Chegg Study, thinking someone is going to write the code for you.
That's not going to happen.
|
|
|
|
|
Copy off of the guy sitting next to you. It's your only hope.
"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
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Hi
I have a C DLL that processes data for a MFC C++ program. It happens to be my FTP folder where files are received from FTP. when I step thru the code under the VS debugger everything runs fine
I make a breakpoint in the MFC code and when after getting the ProcAddress I go into the function.
So how do I know what the problem is when I don't run under the VS debugger, well I have a SEH (handler that pops up with a messagebox and I attach the debugger and observe the rc from _sopen_s that fails)
I decided to put a MessageBox in when it fails (in the DLL) and upon entry to the DLL as well, in the hope that I can then attach the debugger and get a better idea but the messagebox fails to appear I do re-link the MFC program as well
I went as far a deleting the .lib TO ensure I was picking it up while linking the MFC program and I got a link error so I know its picking the .lib of the DLL
I am running both the (VS Debugger and the MFC program in administrator mode)
|
|
|
|
|
Well it could be any one of a million things, but without more information it is pointless trying to guess. Also deleting the .lib file does not guarantee that you are loading the correct .dll at execution time. You should start by rebuilding everything from clean to ensure that no component is out of sync. Secondly, and much more importantly, where does the EACCESS * error occur, and what is the code trying to do at that point?
*EACCESS is returned (most often) when trying to access some file/directory that is protected. And even when running in admin mode some things remain blocked.
|
|
|
|
|
The EACCESS occurs on _sopen_s the only thing I can think of regarding that is that I have the path + filename and maybe the open function only takes a file name
Regardless I’m gong you’re-build the DLL thanks
|
|
|
|
|
What exactly are you trying to open, and what sharing options are you using?
Quote: EACCES The given path is a directory, or the file is read-only, but an open-for-writing operation was attempted.
|
|
|
|
|
It’s a mainframe z/os sysadata file which is a binary representation of Z/OS Assembler program listing I have all the big endian conversion routines for going from mainframe to pc it did work as I was able to display the listing in the richedit that called the DLL and processed this file thanks
|
|
|
|
|
I have a code:
template <typename Func, typename... Args>
auto Add(Func&& f, Args&&... args)
{
using RetType = std::invoke_result_t<Func, Args...>;
and on last line, at compiling time I got:
error C7510: 'invoke_result_t': use of dependent type name must be prefixed with 'typename'
How can I overcome this error ?
|
|
|
|
|
I believe that typename is supposed the be prefixed to tell the compiler that invoke_result_t is defining a type:
using RetType = std::typename invoke_result_t<Func, Args...>;
|
|
|
|
|
I have tried:
using RetType = std::typename invoke_result_t<Func, Args...>;
but I got:
error C2589: 'typename': illegal token on right side of '::'
|
|
|
|
|
Try moving it to the front:
using RetType = typename std::invoke_result_t<Func, Args...>; This[^] may be of help.
|
|
|
|
|
I already did:
using RetType = typename std::invoke_result_t<Func, Args...>;
Result:
error C2760: syntax error: unexpected token '<', expected ';'
|
|
|
|
|
See "Helper types" on this page[^]. It looks like invoke_result_t is itself a type alias. Try std::invoke_result without the _t .
|
|
|
|
|
|
CString isWrong = _T(" is wrong");
CString andMsg = _T(" and ");
bool bCorrect[4];
int numOfFalse = 0;
for(int i=0; i<4; i++){
bCorrect[i] = true;
if(arrA[i] != arrB[i]){
bCorrect[i] = false;
numOfFalse++;
}
}
for(int i=0; i<4; i++){
if((bCorrect[i] == false) && (numOfFalse == 2))
{
strRslt.Format("Q%d", i+1);
m_listRslt.AddString(strRslt + isWrong);
}
}
I want to print out something like Q1 and Q2 is wrong. Can anyone teach me ?
|
|
|
|
|
if((bCorrect[i] == false) && (numOfFalse == 2))
{
strRslt.Format("Q%d%sQ%d%s", i, andMsg, i + 1, isWrong);
printf("%s\n", strRslt);
}
|
|
|
|
|
Assume the false value is random assign in the array. The program will check by itself which index has a 'false' then print out the index number.
For example,
index 0 and 3 have 'false', then
print out "Q1 and Q4 is wrong"
|
|
|
|