|
If you are using Unicode, you'll have UNICODE and _UNICODE defined either in the stdafx.h file, or in the project settings (/D).
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Yes, it's UNICODE .
By the way, MessageBox((LPCTSTR) "Wrong host") shows rubbish, while MessageBox(_T("Wrong host")) works fine.
|
|
|
|
|
Mike Borozdin wrote: Yes, it's UNICODE.
That might explain why gethostbyname() does not work. It's Ansi only. Try this:
void CNetScanMfcDlg::OnBnClickedButton1()
{
PortScanner portScanner(m_host, m_startPort, m_endPort);
}
PortScanner::PortScanner(LPCTSTR sHost, int startPort, int endPort)
{
address.sin_family = AF_INET;
USES_CONVERSION;
hostent *host = gethostbyname(T2A(sHost));
address.sin_addr.s_addr = (unsigned long) atoi(host->h_addr_list[0]);
this->startPort = startPort;
this->endPort = endPort;
} Mike Borozdin wrote: By the way, MessageBox((LPCTSTR) "Wrong host") shows rubbish...
Since you are using Unicode, try:
MessageBox(L"Wrong host"); Using the _T() macro is the preferred method, however.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
I hope making it work also included checking if host is NULL before using it...
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Sure, I will add the input validation, having a web development background I know how it's important .
|
|
|
|
|
I am working on an application which needs to respond to any DDE message intended for any DDE application if a certain file is being opened.
I have written the app so far to respond to the WM_DDE_INITIATE with WM_DDE_ACK and then get the filename from the WM_DDE_EXECUTE message, the problem I have now is how do I terminate the conversation and let the intended application receive the message if I do not want to process it? Is this possible?
|
|
|
|
|
Hello,
here is a description of what I want to do, to which I will need some pointers.
(A) I have an application that needs to detect when an arbitrary application calls the system standard dialog to save a file with a different name.
(B) Once detected it needs to extend it by adding some custom controls on it, and allowing the user to change some parameters in those controls.
(A) - trying to implement using system wide hooks, but not sure what to what WH_xxx to subscribe to.
(B) - I know that there is a OPENFILENAME that comes when an application calls GetSaveFile(), and this might somehow work.
Questions:
1 - how to implement correctly (A) ?
2 - once done that, will the initial idea ever work to have it work for an arbitrary application ? becaue till now all I saw is that people do this but only for Save Dialogs that are part of their application.
thanks
|
|
|
|
|
for A I think the besst option is with hooks. how? Sorry but there I can't help you
for B I would subclass the CFileDialog with your custom controls and depending on what the hook says, you choose one or the other to answer the call.
But I don't understand what do you want to change for example in the Word "save as.." to make it different of the Access "save as..."
You dont have access to the serialize functions of third party programms, so... for what do u want to customize the save as...? If you modify something in the parameters of the CFileDialog that has relevance with the programm that called him, you will may have compatibility problems with the saved datas.
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
|
|
|
|
|
it seems with hooks this is not possible.
what I did is tryin to have system wide API spy, and when there is a GetSaveFileName() called I just override the flags in the OPENFILENAME structure by adding the hook function and custom dialog.
will see if this helps.
|
|
|
|
|
But the most important questions is...
how do you want to save the datas when a third party programm wants to "save as..."????
I mean, Adobe saves the data in different way than Office, Paint vs Photoshop, and so on...
If you don't have access to the serialize or the data structure of the programm that is wanting to save as... how do you want to save the data??? And how do you want the other programms to respond to your customized controls in the second dialog? They will mos probably not recognise their functionability.
I think what you want to do (detecting the Save as.. from other programms) is posible, but to use it correctly afterwards...
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
|
|
|
|
|
I have been looking for something to confirm before asking but...
#define PC_MAGIC 0x23958670UL
here the UL means unsigned long, doesn't it?
I have use this constant in my programm as well without the UL and it worked good.
But I wonder what a problem I can get if don't use it as in the old C-coded example I follow to improve the new functionality in my program.
This is the first DWORD that has to be saved in the PLC, but the info is senden as 4 BYTES not as a DWORD. I'm a bit confused
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
|
|
|
|
|
if you don't specify UL, it will be interpreted by default as an integer (int ).
but in a 16 bits environment, an int is 16 bits wide, so, your number would be truncated...
|
|
|
|
|
Ahmmm, then this is the point. It was coded at the end of the 90ies. In plain C.
in that programm the datas are sent with
DWORD GetArrayLong( const CByteArray& array, int nOffset )
{
DWORD dwValue = 0;
for( int nIndex = 0; nIndex < sizeof(DWORD); nIndex++ )
dwValue |= ((DWORD) array[nOffset + nIndex] << (nIndex * 8));
return dwValue;
}
But in my programm I send it BYTE per BYTE with
for (i = 0; i < dataSet.GetCount (); i ++)
{
for (j = 0; j < dataSet[nOut].attSet.GetCount(); j ++)
{ byteTemp = dataSet[i].attSet[j].point.x;
pDataBuf = &byteTemp;
file->Write (pDataBuf, sizeof (BYTE));
}
dwActualPos = file->SeekToEnd ();
}
I know that is not elegant but works
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
|
|
|
|
|
AS long as you restrict yourself to 32bit x86 programming, an unsigned long , DWORD and 4 BYTES can all be equivalent. In 'modern' C++ you might use
static const unsigned long PC_MAGIC = 0x23958670;
within a class definition and sizeof(unsigned long); to give you the number of bytes this actually takes up. These days it's wise to consider both 32 and 64 bit scenarios and perhaps even the mysteries of 'byte ordering' and 'endianness', depending on how portable you want your code to be. What fun
Nothing is exactly what it seems but everything with seems can be unpicked.
|
|
|
|
|
I know that your answer is a good answer and you are saying something important, but... I don't understand you right (non english speaker).
The fact is that the programm should work only in the laptops of my firm (all new mashines) and some client computers that buy the application to have the online monitor.
And the only computer that can be a problem for me, is the old project with old C version of these programm because is still working with win95. But my boss wanted it with VC++ 6.0 in order to work with XP for the possible new applications/projects. I know that I have still to find a good programming style and make a lot of changes to have no portability problems. But with short deadlines, the most important thing for my boss is to know that it works with our equipes.
I will rewrite the code in the future to make it international, portable, and some changes I think would be better but my actual boss doesn't want them.
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
|
|
|
|
|
Sorry for the sophomoric nature of this question... I've looked thru an old Stroustrup book, and Googled it and didn't find an answer.
I have a class with three data members. When used in a bare context (no operators surrounding it), I would like the class variable to return the first data member. I can't use the default copy constructor because that is already used for other purposes.
struct myclass{
char *str;
size_t len;
size_t ofst;
};
myclass a1;
char strng[50];
strncpy( strng, a1, 50 );
If str could be made the "default" member, the above line would work. Is this possible?
David
|
|
|
|
|
DQNOK wrote: strncpy( strng, a1, 50 ); //error. should have been
//strncpy(strng, a1.str, 50);
This might work if you had a const char* operator (strncpy() 's second argument type) in your struct .
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Not generically no. What you can do is write a custom cast operator so that when the Compiler attempts to cast your myclass to a char* to match the parameters of strncpy str is used. Something like:-
<br />
<br />
operator char*()<br />
{<br />
return str;<br />
}<br />
<br />
defined within the struct. This is probably not considered 'good' code but as you asked.
Nothing is exactly what it seems but everything with seems can be unpicked.
|
|
|
|
|
I think you nailed it.
In my original post I had started to ask if it was good form, but decided to wait to see if it was even possible. Another poster has directed me to a later Stroustrup book. I'll take a look to see what Mr. Stroustrup says.
Thanks a lot.
David
|
|
|
|
|
Oops; it's a Scott Meyers book, not a Stroustrup book...
|
|
|
|
|
|
Thanks. I had forgotten about user defined type conversions (C++, Stroustrup, 7.3.2)
I don't have the Effective C++ book on hand, and the link doesn't divulge Scott's secrets. Stroustrup discusses some of the issues. Maybe that's enough...
David
|
|
|
|
|
IMHO Meyers work is a "must read".
|
|
|
|
|
I just now ordered it thru Amazon.
|
|
|
|
|
led mike wrote: IMHO Meyers work is a "must read".
Definitely!
Though I speak with the tongues of men and of angels, and have not money, I am become as a sounding brass, or a tinkling cymbal. George Orwell, "Keep the Aspidistra Flying", Opening words
|
|
|
|