|
Two things:
1. If applied to a very long string (e. g. a string containing an entire article or book) the result string becomes unreasonably large. You might want to determine the minimum between strlen(str) and 256 rather than just strlen(str) . Also, since you're printing the chars as ints, you'll need at least 6 bytes to store the result of "%c %d;" from sprintf() since the first value can be up to 3 digits long.
2. You're printing the characters as integers, against the specification. (note: you can safely do so since you won't count any nonprintable characters that might meddle with your output). Printing chars as chars will also shorten the output string (see above)
|
|
|
|
|
Hi Stefan,
Not sure this quick answer deserved such in-depth excellent review
My updated post should address your pertinent issues, and handle empty input string.
cheers,
AR
When the wise (person) points at the moon the fool looks at the finger (Chinese proverb)
|
|
|
|
|
I have written a simple, test case DLL for the Metatrader 4 platform but unfortunately it is not working, and the first thing I would like is to check that my parameter passing syntax is correct.
The C++ code
MT4_EXPFUNC void _stdcall updateBuffer( history * history, double * buffer, int Bars, int IndicatorCounted, int ma_period )
{
for( int ii = 0; ii < Bars; ii++ )
{
buffer[0] = history[ii].close;
}
}
The .mgh code
#import "test.dll"
void updateBuffer( double& history[][6], double& buffer[], int bars, int indicator_counted, int ma_period );
#import
The relevant parts of the .mq4 file
#import "test.dll"
void updateBuffer( double& history[][6], double& buffer[], int bars, int indicator_counted, int period );
#import
int start(){
updateBuffer(history, buffer, Bars, IndicatorCounted(), ma_period);
}
Could someone check that I have declared and am passing all parameters correctly?
|
|
|
|
|
The number of indirection see to not be the same. Why the declaration of parameters in C++ code are not exactly the same as the one in Metatrader 4? (By the way, I don't knows that platform).
In the first code snippet, there is an error. It is written history * history for the first parameter.
The [6] is also required in C++ as otherwise the compiler won't know that there are 6 consecutive doubles for that index level.
Otherwise a & is typically equivalent to an * at the assembly level. Same for a [] which is essentially equivalent to an * but this time at the source level.
Philippe Mori
|
|
|
|
|
I am simply trying to figure this out.
So, we have this API, GetQueuedCompletionStatus , which among others params, returning completion key which is "per device" and overlapped struct, which is "per call". Or something like this. In every example on the net and in platform SKD's samples, The Overlapped structure gets extended like this:
struct MyOverlapped
{
OVERLAPPED Overlp;
};
And then it is used with
GetQueuedCompletionStatus and other calls (WSAREcv, WSASend, etc). So the question is: why is that so? Why not use only completion key? From my observations, (debugging), data, which arrives with the completion key and data which gets extracted from casting MyOverlapped to received overlapped, is completely the same. For example, somewhere we do:
MyOverlapped * myOver = do_something_insert_something();
PostQueuedCompletionStatus(..., (ULONG_PTR)myOver, ...);
and inside worker thread, we have:
MyOverlapped * myOver = NULL;
GetQueuedCompletionStatus(..., (PULONG_PTR)&myOver, ...);
This code above returns the same what this code below:
MyOverlapped * myOver = do_something_insert_something();
PostQueuedCompletionStatus(..., (ULONG_PTR)0, &myOver->Overlp);
and then in worker thread:
MyOverlapped * myOver = NULL;
ULONG_PTR Data;
LPWSAOVERLAPPED Overlapped = NULL;
GetQueuedCompletionStatus(..., (PULONG_PTR)&Data, (LPOVERLAPPED *)&Overlapped);
myOver = (MyOverlapped *)Overlapped;
So why to extend Overlapped structure and whats the deal with these: "per device" and "per call"?
Thanks
011011010110000101100011011010000110100101101110
0110010101110011
|
|
|
|
|
The key is per-handle, not per device.
Many Win32 APIs have a pointer-sized parameter that applications can use and the system simply passes through. This is one of those.
Depending on implementation, one may need a place to store some data associated with the lifetime of the handle - a pointer to a C++ object, an index into an array, an ID number, etc. That may not be something wanted in the overlapped structure which technically is only used by the system for each overlapped operation.
As I've mentioned to you, I personally reuse the same custom OVERLAPPED structure object for multiple I/O calls, so for my implementations I can keep per-handle data there as well. So, yes the key is not relevant to me.
It's there if you need it, ignore it if you don't need it (the system ignores it)
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: The key is per-handle, not per device.
Thanks! This explains couple of things.
Ok, so (from that what i can see) if this will be a good practice (currently i am reusing custom Overlapped struct too):
1. Key data structure, which holds, lets say, a socket - accepted or connected or listening, some other things related to a socket, which are valid as long as our socket is valid, for example local and remote ip addr and port. - so all this lives as long as our socket lives
2. Extended Overlapped structure, which holds, for example, such info like current I/O operation and WSABUF and probably nothing else.
Or maybe all this is just playing around and doesn't matter at all and it's ok to just use extended Overlapped all the time? And, (probably) last (probably lame :P) question - it just came to my mind, for now my server prototype is running on localhost and not event close to be loaded so every call to wsasend / wsarecv completes right away without waiting and i am manually posting completion packets with PostQueuedCompletionStatus to simulate expected behavior, where key param is my struct of course, and IO operation is updated before packet is actually posted. So on the other end, i am parsing IO operations correctly. But, i am thinking now, if wsarecv will block and completion packet will arrive some time later - so how on the other end i can correctly parse current IO operation? And maybe exactly in such case - i need this extended overlapped and only, because on the other end (in worker thread in fact) - when packet will arrive, - i'll get this exact Overlapped and will be able to grab current IO?
Am i crazy, wrong or maybe this is how it is?
Thanks in advance
011011010110000101100011011010000110100101101110
0110010101110011
|
|
|
|
|
1. Agree.
2. Agree.
Or maybe ... So on other end ...
Which is how you can use an IOCP to be a job/task manager like you could also create using the Win32^ Job Object / Thread Pool functions.
But I am thinking now ...
wsarecv(OL) will not block your posting thread.
When GetQueuedCompletionStatus returns the results of the wsarecv, the specified buffer will be filled with the received data ... of course this means the buffer specified in OL must persist from time wsarecv(OL) is called until you are done with it after GetQueuedCompletionStatus.
If you did not get all data (i.e. only posted recv to get a header) then either post another async recv, or (depending on how you handle things) you may be able to call a sync recv to get rest of data (e.g. payload).
...cmk
The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.
- John Carmack
|
|
|
|
|
csrss wrote: ...my server prototype is running on localhost and not event close to be loaded so every call to wsasend / wsarecv completes right away without waiting and i am manually posting completion packets with PostQueuedCompletionStatus to simulate expected behavior, where key param is my struct of course, and IO operation is updated before packet is actually posted. So on the other end, i am parsing IO operations correctly. But, i am thinking now, if wsarecv will block and completion packet will arrive some time later
Maybe overthinking it? First, even if wsasend/wsarecv complete immediately, you still get completion packet from IOCP on an IOCP thread, so no need to handle special case of error on wsasend/wsarecv if there's no error or error code is "pending". Second, WSARecv won't block on an overlapped operation, so I'm not sure what you're thinking there.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Alright, thanks guys, going to experiment a bit longer with this.
By "blocking" i meant a situation where you "post" wsarecv / wsasend and it returns error_io_pending and then awaits for completion packet in worker thread :P
011011010110000101100011011010000110100101101110
0110010101110011
|
|
|
|
|
csrss wrote: By "blocking" i meant a situation where you "post" wsarecv / wsasend and it returns error_io_pending and then awaits for completion packet in worker thread :P
Gotcha. But technically that is not blocking...that's asynchronous I/O
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
One framework I created that used ICOP had the following classes:
IoObj - Base class for I/O
IoHnd - IFS handle based
File - OS file access
NetSocket - Network socket
NetIpClnt/NetIpSvc, NetTCP*, NetUdp*, NetIrda*, NetBth*, ...
NetFPT*, NetNNTP*, ...
WSAOVERLAPPED
IoOL - Base overlapped; adds flags, timestamps, type, control, buffer
NetIoOLAddr - specialied for sendto/recfrom, contains remote address
NetIoOLAccept - specialized for handling AcceptEx
IoCP - I/O completion port
The IoCP had the main posting functions and GetQueuedCompletionStatus loop.
To post a msg on an IoCP you'd pass an IoObj* and IoOL*.
The IoObj* would be the key, the IoOL* the overlapped (per call).
The IoCP GetQueuedCompletionStatus loop would call (something like) IoObj->Msg(IoOL*).
With the above you can use one or more IoCP instances to handle any combination of files, sockets, or other IoObj based objects (e.g. jobs/tasks).
I found both having key and OL convenient. Without an explicit key param you'd have to add it as state to your extended OL ... which you may want anyways.
...cmk
The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.
- John Carmack
|
|
|
|
|
Thanks for the reply. Currently i am trying to dig into IOCP and get some descent understanding what's going on behind scenes. Could you check my latest reply to Mark? There is some important question i am trying to figure out though. Thanks
011011010110000101100011011010000110100101101110
0110010101110011
|
|
|
|
|
Hi all,
i want to encrypt/decrypt the string.
what method or option is gud for this.
please help me for this.
if possible please provide me any sample or example.
thanks in advance.
|
|
|
|
|
If you are working under windows then check out The Cryptography API[^].
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> //TODO: Implement signature here<
|
|
|
|
|
Depending on your needs, the following may be sufficient:
CryptProtectData()
CryptUnprotectData()
They encrypt using either machine or user specific key and help you avoid having to mess with the Crypto API.
...cmk
The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.
- John Carmack
|
|
|
|
|
From my application, I need to launch another window which will display some data like an SDI application. Also, this launched window should
(a) find a separate mention in taskbar
(b) close when my application is closed
I think a good way to achieve this is to have an MFC DLL, exporting a function to launch this other window as we create an SDI document.
I don't want to perform any File I/O from the DLL currently, so I inherited from
CDocument without putting any code inside
Serialize .
So I have:
CSingleDocTemplate *pPeopleListDocumentTemplate;
pPeopleListDocumentTemplate = new CSingleDocTemplate(IDS_DUMMY_STRING, RUNTIME_CLASS(CPeopleDoc),
RUNTIME_CLASS(CFrameWnd), RUNTIME_CLASS(CDLLDocView));
That is, I give my frame class as CFrameWnd.
This kind of worked: I do see the document when I call the DLL function. But, the window is totally "transparent" initially, and takes the appearance of whatever's present on the screen behind it, and retains it as I move it. What are the properties of the Frame which I need to change? What will be a good time to change it?
|
|
|
|
|
How to import database into C++ or C++ to any other applications..? 
|
|
|
|
|
Your question is not clear, you cannot import a database into C++. You can, however, access a database using a program written in C++.
The best things in life are not things.
|
|
|
|
|
You don't typically "import" a database into an application. You simply access it using some sort of common interface, usually over a network or internally (using sockets is the most common way), using a common language. A common interface language for databases is SQL, a query based language that defines the type of query/response system and language.
There's several libraries that are available from different parties that make this task a lot easier. Here's a couple (for SQL, its up to the database maker what languages they support):
http://www.sqlapi.com/[^]
http://soci.sourceforge.net/[^]
|
|
|
|
|
Hi ppl.
I have this code:
void descargar(string path1, SOCKET sock)<br />
{<br />
string variable = getenv("windir");<br />
char* variablee = getenv("windir");<br />
string variable1 = getenv("userprofile");
char* variable11 = getenv("userprofile");
<br />
strcat(variablee,"\\System32\\ftp.exe -s:");<br />
strcat(variablee,variable11);<br />
strcat(variablee,"\\command1.txt host.com");<br />
FILE * file;<br />
file= fopen((variable1+"\\command1.txt").c_str(),"w");
if(file != NULL)<br />
{<br />
fputs("name\n",file);
fputs("pass\n",file);
fputs("cd /public_html\n",file);
fputs(("put \"" + path1+"\"").c_str(),file);
fputs("\nquit",file);<br />
fclose(file);<br />
}<br />
<br />
STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcInfo;
memset(&ProcInfo, 0, sizeof(ProcInfo));
memset(&StartInfo, 0 , sizeof(StartInfo));
StartInfo.cb = sizeof(StartInfo);
int res = CreateProcess(NULL,variablee, NULL, NULL, NULL, NULL, NULL, NULL, &StartInfo, &ProcInfo);
{<br />
::WaitForSingleObject(ProcInfo.hProcess, INFINITE);<br />
CloseHandle(ProcInfo.hProcess);<br />
CloseHandle(ProcInfo.hThread);<br />
}<br />
}
The problem, is that, the first time i call this function works fine, but the second time it is called, it gives segmentation fault error in line:
file= fopen((variable1+"\\command1.txt").c_str(),"w");
Any idea?
Thanks
|
|
|
|
|
Hope so, but likely not -
I'd try something along these lines:
char filenameToOpen[MAX_CHAR];
sprintf(filenameToOpen, "%s\\command.txt",variable1.c_str());
file = fopen(filenameToOpen, "w");
If that failed, I'd ask myself if I'd closed the file between each time it was opened as I can't remember how whether or not fopen opens the file for exclusive access or not.
|
|
|
|
|
According to the C++ documentation, you are not allowed to change the value returned by getenv().
http://www.cplusplus.com/reference/clibrary/cstdlib/getenv/[^]
Get environment string
Retrieves a C string containing the value of the environment variable whose name is specified as argument. If the requested variable is not part of the environment list, the function returns a NULL pointer.
The string pointed by the pointer returned by this function shall not be modified by the program.
In these statements,
strcat(variablee,"\\System32\\ftp.exe -s:");
strcat(variablee,variable11);
strcat(variablee,"\\command1.txt host.com");
you are appending to (altering) the contents of the memory pointed to by the return from getenv(). You need to use a temporary location to copy the data and only then start appending. Remember that strcat does not do additional allocation, it just blindly appends to memory.
Lastly, you have both char * and string copies of these environment variable contents. You should use the string versions which will do the copying for you and remove the use of the char * versions.
|
|
|
|
|
Hi. So, i got my custom static control (class which inherits from CStatic), which displays a text on a dialog window and thats it. Now i am trying to determine its style, which was sat in resource editor. For example, center image was sat, SS_CENTERIMAGE, so i am doing this:
DWORD dwStyle = this->GetStyle();
if((dwStyle & SS_CENTERIMAGE) == TRUE)
{
::AfxMessageBox(L"center image");
}
It is not working. Nothing is working actually. I am trying to check text alignment - not working, what am i doing wrong? Thanks.
011011010110000101100011011010000110100101101110
0110010101110011
|
|
|
|
|
csrss wrote: if((dwStyle & SS_CENTERIMAGE) == TRUE)
& is not a boolean operation, nor is SS_CENTERIMAGE equal to 1 . Try:
if ((dwStyle & SS_CENTERIMAGE) == SS_CENTERIMAGE)
"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
"Some people are making such thorough preparation for rainy days that they aren't enjoying today's sunshine." - William Feather
|
|
|
|
|