|
See the (much more copmplete) answer from Roger Stoltz.
He says it all.
|
|
|
|
|
Hi Elaine,
I suggest you forget about MsComm32.ocx and write your own class for serial communications.
If you really want an "event" you can use ::WaitCommEvent().
I've written a lot of applications for serial communications all using the same technique:
overlapped I/O, three threads, two message object queues for each port and one callback for received data.
One sending thread, one receiving thread that are spawned from the main thread when the port is opened with a call to ::CreateFile().
The sending thread waits, ::WaitForMultipleObjects(), for a semaphore released with the same amount as message objects added to the send queue.
The receiving thread issues a ::ReadFile() which usually will return FALSE since I use overlapped I/O and ::GetLastError() will return ERROR_IO_PENDING. The receive thread then waits for the event in the OVERLAPPED struct to be signaled.
Having set the comm timeouts properly with ::SetCommTimeouts() the receive event should be signalled after each data package received. How to set the values for the comm timeouts depends on your requirements. Usually I use '1' for ReadIntervalTimeout and '0' for the rest of the parameters.
When the event is signalled, verify the read operation with ::GetOverlappedResult() and you will also get the number of bytes actually read and copied to the buffer you supplied with the call to ::ReadFile(). You could call a callback function from here, or send a windows message or whatever you like for notification, just remember that this is another thread (especially if you use the callback technique).
When you "close" the port, you have to call ::CancelIo() from each thread that has issued a request to the port driver before calling ::CloseHandle().
It's supposed to be hard, otherwise anybody could do it!
|
|
|
|
|
Thanks Roger, that is just what I want
Elaine (eternally greatful fluffy tigress)
The tigress is here
|
|
|
|
|
i am trying to made a class which have to drive from 'COleDropTarget'
but on my site installed visual studio does not show this class as base so please tell me what is the reason.
Bankey Khandelwal
Software Engineer
Bankey Khandelwal
Software Engineer
|
|
|
|
|
You can derive from any class you like. The wizard does not show them all, but you should generally avoid using the wizards, and learn to do it yourself
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
So I want to enumerate the processes using NtQuerySystemInformation() native api.
I load it from ntdll.dll
i use the process structure below unlike the one documented by microsoft. but i've seen that others use it too.
typedef struct _SYSTEM_PROCESS_INFORMATION
{
DWORD dNext;
DWORD dThreadCount;
DWORD dReserved01;
DWORD dReserved02;
DWORD dReserved03;
DWORD dReserved04;
DWORD dReserved05;
DWORD dReserved06;
QWORD qCreateTime;
QWORD qUserTime;
QWORD qKernelTime;
UNICODE_STRING usName;
DWORD BasePriority;
DWORD dUniqueProcessId;
DWORD dInheritedFromUniqueProcessId;
DWORD dHandleCount;
DWORD dReserved07;
DWORD dReserved08;
VM_COUNTERS VmCounters;
DWORD dCommitCharge;
SYSTEM_THREAD Threads[1];
} SYSTEM_PROCESS_INFORMATION;
the thing is that when I call it I don't get any error code or null pointers but the structure's members are zeros.
the dNext member is not zero but I can't obtain the next pointer for another system_process_information because i get the invalid pointer error when I try this:
if (ProcessInfo->dNext!=0)
ProcessInfo=(SYSTEM_PROCESS_INFORMATION_DEF *)((ULONG *)ProcessInfo+ProcessInfo->dNext);
And I have another question.
How much space should I allocate for the ProcessInfo structure
i only allocate for one structure
SYSTEM_PROCESS_INFORMATION *ProcessInfo=(SYSTEM_PROCESS_INFORMATION *)malloc(sizeof(SYSTEM_PROCESS_INFORMATION));
or I shouldn't allocate at all. I will obtain a pointer to the structure anyway ?
here is the code I use:
HMODULE ntHinst;
ntHinst=LoadLibraryA(NTDLL);
if (ntHinst==NULL)
{
MessageBoxA(GetDesktopWindow(),"Error loading ntdll\nThe program will now end","ERROR",MB_ICONSTOP);
return 0;
}
_NtQuerySystemInformation=(NTQUERYSYSTEMINFORMATION)GetProcAddress(ntHinst,"NtQuerySystemInformation");
if(!_NtQuerySystemInformation)
{
MessageBoxA(GetDesktopWindow(),"Error obtaining function pointer\nThe program will now terminate","ERROR",MB_ICONSTOP);
return 0;
}
SYSTEM_PROCESS_INFORMATION *ProcessInfo=(SYSTEM_PROCESS_INFORMATION *)malloc(sizeof(SYSTEM_PROCESS_INFORMATION);
if (IsBadReadPtr(ProcessInfo,sizeof(SYSTEM_PROCESS_INFORMATION))||IsBadWritePtr(ProcessInfo,sizeof(SYSTEM_PROCESS_INFORMATION)))
return 0;
_NtQuerySystemInformation(SystemProcessInformation ,(PVOID)ProcessInfo,sizeof(SYSTEM_PROCESS_INFORMATION),&ret);
if (ret==0)
{
MessageBoxA(GetDesktopWindow(),"Function Call Failed: NtQuerySystemInformation\nThe program will now terminate","ERROR",MB_ICONSTOP);
return 0;
}
if(ProcessInfo==NULL)
{
MessageBoxA(GetDesktopWindow(),"Function Call Failed: NtQuerySystemInformation\nThe program will now terminate","ERROR",MB_ICONSTOP);
return 0;
}
while(ProcessInfo!=NULL)
{
//RtlUnicodeStringToOemString(usname,&ProcessInfo->usName,TRUE);
//MessageBoxA(0,usname->Buffer,"",MB_OK);
//RtlFreeOemString(usname);
HANDLE hProc;
hProc=OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,ProcessInfo->dUniqueProcessId);
if (hProc!=NULL)
{
HMODULE hmods[300];
DWORD retv;
char fname[1024];
EnumProcessModules(hProc,hmods,sizeof(hmods),&retv);
retv=retv/sizeof(DWORD);
GetModuleFileNameA(*hmods,fname,sizeof(fname));
MessageBoxA(GetDesktopWindow(),fname,"Process Name",MB_OK);
}
else if (ProcessInfo->dNext!=0)
ProcessInfo=(SYSTEM_PROCESS_INFORMATION_DEF *)((ULONG *)ProcessInfo+ProcessInfo->dNext);
else
ProcessInfo=NULL;
if (ProcessInfo->dNext!=0)
ProcessInfo=(SYSTEM_PROCESS_INFORMATION_DEF *)((ULONG *)ProcessInfo+ProcessInfo->dNext);
else
ProcessInfo=NULL;
}
free(ProcessInfo);
So I get no errors durin calling. but I also get a structure full of zero's.
What is the pb ?
gabby
|
|
|
|
|
Hello i have created a directory a included a file in that ok.Now using Gobal alloc function i wanted to allocate memory for that folder,how can it been done .
|
|
|
|
|
sundar_mca wrote: ...i wanted to allocate memory for that folder...
What exactly do you mean by this?
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
"There is no death, only a change of worlds." - Native American Proverb
|
|
|
|
|
Hello EB,
I have following Code snnipet in my Application,
SQLHENV hEnvHandle;
SQLRETURN nRet;
nRet = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnvHandle);
nRet = SQLSetEnvAttr(hEnvHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
SQLSetEnvAttr return 0 but my Debug Console window show
"First-chance exception in MyApp.exe (KERNEL32.DLL): 0xC0000005: Access Violation."
like this
sr = SQLSetStmtAttr(tempStmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_DYNAMIC, SQL_IS_INTEGER);
sr = SQLSetStmtAttr(tempStmt, SQL_ATTR_CONCURRENCY , (void *)SQL_CONCUR_LOCK, 0);
APIS also shows this exception.
What might be the cause?
Hope for Reply...
Thanks & Regards
Amit
|
|
|
|
|
Hello,
I was experiencing a strange error that I tracked down to be a declaration in Form1.h
I attemped to reproduce the problem in a brand new project and to my surprise: the error appeared again.
In the new "windows forms" project
test1.cpp:
<br />
#include "stdafx.h"<br />
#include "form1.h"<br />
Added to form1.h
<br />
int test;
error:
test.obj : error LNK2005: "int test" (?test@@$$Q3HA) already defined in IncludeTest.obj
D:\VC\IncludeTest\Debug\IncludeTest.exe : fatal error LNK1169: one or more multiply defined symbols found.
I have tried int test in stdafx.h. This does compile though stdafx.h is also included in both the main and test.cpp.
Project available here (44k, created with VC++ 2005)
I thought this was according to c++ language rules, but apparently I am doing something wrong?
Best regards,
Jan Timmerman
|
|
|
|
|
If you have not already, try adding guards to your header-file.
I am not sure about your background, but each header-file should have a guard:
test1.h:
#ifndef _TEST1_H_
#define _TEST1_H_
..... your header information .....
#endif
test2.h:
#ifndef _TEST2_H_
#define _TEST2_H_
..... your header information .....
#endif
etc.
|
|
|
|
|
The problem is that memory for that variable is being allocated in every source file that includes that header file - the linker is unable to determine which one to keep and which ones to throw away. All it knows is that the two memory locations have the same name - it doesn't know that they are the same variable.
The solution is to mark the variable as extern in the header file, and declare it as normal in exactly one of the source files.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Perhaps that might work.
This does not explain though why it is allowed to say int test; in stdafx.h (which is included also in a lot of places)
Also I thought int test; is a declaration here. It would be illegal to write int test=3; .
I will give your suggestions a closer look, thanks for your quick replies!
-- modified at 7:47 Monday 6th March, 2006
Well, it works, thanks a lot!
|
|
|
|
|
jantimmerman wrote: This does not explain though why it is allowed to say int test; in stdafx.h (which is included also in a lot of places)
It's because you're using precompiled headers. VC++ only compiles the header once, and just references it in all the other files that include it. If you turn off precompiled headers, you'll have the same problem there.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
I am experiencing problems after migrating to VS 2005 from VS 2003.
The application throws up an error saying mfc80u.dll cannot be loaded. According to MSDN this problem occurs because VS 2005 generates it's own embedded manifest file so if the project already consists a manifest file,there is some problem. They suggest converting the manifest to a header and using it as #pragma comment(linker,dependency).
Require help urgently on how to convert the manifest into .h and include it in preprocesor.
thanks in advance.
|
|
|
|
|
Hello Friends,
I have an a VC++ 6.0 SDI Application and wants to convert into a .Net application. Please help me out in this conversion, I am getting lots of errors as in the stdAfx.h file I had included iostream.h file, which is required?
Help me out.
Neelesh K J Jain.
|
|
|
|
|
you should include iostream.h likewise
<font color=blue>#include</font> <iostream>
and not
<font color=blue>#include</font> <iostream.h>
Nibu thomas
Software Developer
|
|
|
|
|
As someone else said, iostream.h is not standard C++. You also need to put using namespace std; at the top of the code, as standard C++ libraries use the std namespace.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
Hi All,
Is there a fast way of checking to see if an int is a power of 2 (i.e. 2, 4, 8, 16, 1024)? I know the long way using a loop, but I was hoping for a simple way of doing this.
regards,
Rich
"Programming today is a race between software engineers striving to build bigger and
better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far the Universe is winning." -- Rich Cook
|
|
|
|
|
|
Thanks
"Programming today is a race between software engineers striving to build bigger and
better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far the Universe is winning." -- Rich Cook
|
|
|
|
|
I think you will have problems when comparinf the floats, due to the precision.
|
|
|
|
|
true, but that was a starting point.
it would be better to use double at least, but still remains the precision problem.
|
|
|
|
|
2^3 = 8
but
floor(sqrt(8)) != sqrt(8)?
Steve
|
|
|
|
|
Modified version is still wrong - It will treat any integer as a power of 2.
Steve
|
|
|
|
|