|
if I do:
<br />
#DEFINE BUFF_SIZE 0x400;
ULONG *buff = null, numBytesRead = 0;<br />
buff = new ULONG[11250000];
Handle hdl = INVALID_HANDLE_VALUE;<br />
...<br />
while(...){<br />
ReadFile(hndlPciAlt, buff, BUFF_SIZE, numBytesRead, NULL);
...<br />
}<br />
<br />
Where:<br />
BOOl ReadFile(<br />
HANDLE hFile,<br />
LPVOID lpBuffer,<br />
DWORD nNumberOfBytesToRead,<br />
LPDWORD lpNumberOfBytesRead,<br />
LPOVERLAPPED lpOverlapped<br />
);<br />
is a windows function.<br />
Questions:
1) So, I pass in the *buff. ReadFile() will dump the data there.
If I do another ReadFile() will it append to the end of *buff?
OR, will it overlap the data already in the *buff, if so,
how do I make subsequent writes into *buff append to the end of it?
2) Does ReadFile() automatically stick each 32-bit word out of the 1024 words it reads into each of the individual array slot of buff? So, that there will be a total of 256 array elements after the 1st call to ReadFile().
3) If "DWORD nNumberOfBytesToRead" is the min number of bytes to read, will
ReadFile() read more bytes if they are available? If so, how can you
limit ReadFile to only read the specified number of bytes?
Kitty5
|
|
|
|
|
kitty5 wrote: 1) So, I pass in the *buff. ReadFile() will dump the data there.
If I do another ReadFile() will it append to the end of *buff?
OR, will it overlap the data already in the *buff, if so,
how do I make subsequent writes into *buff append to the end of it?
No, it copy the data at the address you pass to the function, which is the begining of your array. If you want to append it, you'll have to increment the address (something like buff+Offset). But warning !! As your buffer is a ULONG, it means that a single increment will point to the next ULONG (so 4 bytes further). It is not a good idea in this case to use a pointer to ULONG, use a pointer to UCHAR instead so you don't have to cast the pointer to a char area in order to be able to increment only one byte.
Remember that ReadFile read data un bytes, so it can read only 3 bytes for example (and there you got the problem because it is not a multiple of 4)
kitty5 wrote: 2) Does ReadFile() automatically stick each 32-bit word out of the 1024 words it reads into each of the individual array slot of buff? So, that there will be a total of 256 array elements after the 1st call to ReadFile().
ReadFile is supposed to read bytes, so it has nothing to do with 32-bit words.
kitty5 wrote: 3) If "DWORD nNumberOfBytesToRead" is the min number of bytes to read, will
ReadFile() read more bytes if they are available? If so, how can you
limit ReadFile to only read the specified number of bytes?
No, it is the number of bytes to read. The function won't read more bytes (yup, I checked MSDN and that's strange they say minimum instead of maximum )
|
|
|
|
|
damn. You beat me to it
Cheers
Steen.
"Are you gonna check your makeup when you're done whining?" John Simmons, 05/31/2006
|
|
|
|
|
Cedric Moonen wrote: If you want to append it, you'll have to increment the address (something like buff+Offset). But warning !! As your buffer is a ULONG, it means that a single increment will point to the next ULONG (so 4 bytes further). It is not a good idea in this case to use a pointer to ULONG, use a pointer to UCHAR instead so you don't have to cast the pointer to a char area in order to be able to increment only one byte.
Ok so I do:
<br />
#define BUFF_SIZE = 0X400;<br />
ULONG numBytesRead = 0, offset = 0;<br />
UCHAR *buff = null;<br />
buff = new UCHAR[45000000];<br />
while(...)<br />
{<br />
ReadFile(hndlPciAlt, buff, BUFF_SIZE, numBytesRead, NULL);
}<br />
how would I pass the offsetted buff address in the while loop?
(i.e. buff + numBytesRead)
Since, every time I got into the loop it will be buff then buff + numBytesRead then buff + numBytesRead + numBytesRead, ... etc.
can I:
<br />
#define BUFF_SIZE = 0X400;<br />
ULONG numBytesRead = 0, offset = 0;<br />
UCHAR *buff = null;<br />
buff = new UCHAR[45000000];<br />
while(...)<br />
{<br />
ReadFile(hndlPciAlt, (buff + offset), BUFF_SIZE, numBytesRead, NULL);
offset += numBytesRead;<br />
}<br />
Is (buff + offset) the proper syntax to increment the address of buff?
Thanks.
Kitty5
|
|
|
|
|
kitty5 wrote: Is (buff + offset) the proper syntax to increment the address of buff?
Yes, that's how you need to do it. And your code snippet is correct also. You can stop the loop when offset == the number of bytes you need to read.
|
|
|
|
|
Thank you so much for helping me clear this all up!
Things are so much clearer after a couple cups of coffee ....
Kitty5
|
|
|
|
|
1) it will overwrite. To append, use lpNumberOfBytesRead to offset the buffer pointer in subsequent calls to ReadFile.
2) Yes. lpBuffer is a void pointer, so it will be handled as an array of bytes. If the endian-ness of the words you read is correct you will get an array of 256 ULONGS when you read 1024 bytes.
3) It will read exactly nNumberOfBytesToRead. ReadFile will wait until it has read these bytes (assuming you don't use overlapped I/O, but that's another story), but it will not read more than this number of bytes (this would also wrech havoc on your buffer)
Cheers
Steen.
"Are you gonna check your makeup when you're done whining?" John Simmons, 05/31/2006
|
|
|
|
|
Steen Krogsgaard wrote: ReadFile will wait until it has read these bytes (assuming you don't use overlapped I/O, but that's another story),
Not necessarily. For example, using a serial port you can configure it with some specific timeouts and it often happens that the read function will time out before having read all the data. But of course, you can configure it with an infinite timeout also (and in that case, it will follow what you described).
|
|
|
|
|
Right. In any case, it won't read more than the number of bytes specified.
Will ReadFile return true if there is a timeout?
Cheers
Steen.
"Are you gonna check your makeup when you're done whining?" John Simmons, 05/31/2006
|
|
|
|
|
Steen Krogsgaard wrote: Will ReadFile return true if there is a timeout?
Yes, it returns true only if an error occurs. A timeout in that case is not an error.
|
|
|
|
|
kitty5 wrote: buff = new ULONG[11250000]; //total of 11,250,000 32-bit words
Just an FYI: Avoid declaring such large chucks of memory (be it stack or heap). While this array alone (which will be about 45 MB) won't cripple your system, imagine declaring 10 or 20 of them (throughout your application). Next thing you know, your application requires a full GB of RAM by itself (not good!). If possible, you should try to read a large file in smaller chunks, process the data, and read the next chuck.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
Dear all,
I am very new in visual C++. I currently use the Visual C++ version 6.0. The problem I am faced on is relative the list controls.
I have a list control in report format with a grid. In that control I load data from an database. I would like to print some items in bold and at the same time I would like to change the text color and the background color of specific item. I saw for the fonts exists a function but I do not understand how to use it. Is it possible to give me an example of how I could do that?
Also I like to achieve some alignments. For example the first column has title “stock descriptions” I would like the next items aligned be based on that. Also I would like if it is possible define some as base and all below became one or more tabs right. Is possible to achieve that? (please give some code example for that if are possible).
Thanks in advance for your time.
Best regards,
Konstantinos.
|
|
|
|
|
|
Dear Sir,
I do not know why but my control does not have the properties that in sample program displayed.
Any ideas?
|
|
|
|
|
konstantinos_1000 wrote: control does not have the properties that in sample program displayed
this is because he have created a new class and modified the drawing of Listcontrol inside that class. In your application instead of using CListCtrl as the base class of the List ctrl, Use the class in that application. There will be funtion in that class that fulfill ur requirment.
nave
|
|
|
|
|
Do you need to change color from CListCtrl?
|
|
|
|
|
|
SeeCListCtrl::SetTextBkColor CListCtrl::SetTextColor CListCtrl::SetBkColor
|
|
|
|
|
dear Sir ,
Could you help me with the adjustment of the data.
Example
main title
parameter-1
sub parameter
sub parameter
parameter-2
|
|
|
|
|
|
Sir, Windows allots 4 GB space for Proccess can you tell me how much of that virtual memory is partitioned for the O.S and for our Application?
Fly Like An Eagle With MIGHTY POWER.
|
|
|
|
|
2 Gb for system, 2 Gb for application
unless you have the /3Gb switch enabled in windows
Setting the 3GB switch
Darka [ Xanya]
"When you're taught to love everyone, to love your enemies, then what value does that place on love?"
|
|
|
|
|
How can I use the GetDeviceGammaRamp/ SetDeviceGammaRamp APIs to adjust the gamma for a dual monitor system with the display set to one screen stretched over two monitors? (Each monitor has its own slightly different gamma adjustments.
I've seen these examples:
http://www.codeproject.com/miscctrl/gamma_manager.asp?msg=1598211&mode=all&userid=16251#xx1598211xx
http://www.codeproject.com/csharp/Gammit.asp
but they don't actually address the issue I am unsure of which i guess is how i get a device context for each monitor even though they are being treated as one screen. Is this possible?
Stephen
|
|
|
|
|
Try using the EnumDisplayMonitors and the HDC is returned in the MonitorEnumProc.
Any sufficiently gross incompetence is nearly indistinguishable from malice.
|
|
|
|
|
Gosh, I know this is a dreadful title, and probably a dreadful thread, so please feel free to direct me elsewhere if appropriate.
I'm just thinking about adding some simple (peer to peer?) network functionality that will allow two users to run a dialog application and send small packets of data, perhaps from controls to each others dialog with a view to some very simple gaming/strategy apps.
Is this something that requires a humongous amount of effort, or can it be cobbled together quite quickly. Assume that the user base for this is likely to be no more than 10 people in the whole world, all friends so it can be quite rough and ready!
ideally if there was a way to "sync" the exchange of data such that Dialog A sent some data but Dialog B couldn't see the result until Dialog B itself had sent a corresponding data item, that would be great.
|
|
|
|