|
In VC6, WSAGetLastError() returns the proper error code, but in VC7 it doesn't. It returns a system code contrary to the documentation. Anyone know why?
Code-------------------------
#include <iostream>
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib")
using namespace std;
int main(int argc, char *argv[])
{
if (!gethostbyname("www.microsoft.com"))
{
cerr << "gethostbyname error " << WSAGetLastError() << endl;
}
return 1;
}
--- Output from VC6 ---------------------
gethostbyname error 10093
--- Output from VC7 ---------------------
gethostbyname error 5
Another oddity is that VC6 returns almost instantly where vc7 takes several seconds (1.4Ghz machine)
|
|
|
|
|
You apparently haven't even bothered to look up what error 5 is (if you had you wouldn't ask).
|
|
|
|
|
Please read my post before attempting to respond.
If you look in the documentation, gethostbyname() returns "a specific error number can be retrieved by calling WSAGetLastError" it continues on to list several error codes. One of which is WSANOTINITALISED, the correct error code in this case.
WSAGetLastError() does not return the specific error code (consistant with previous versions of VC) but a more generic system error of 5. The question is not what does the returned error message mean but why WSAGetLastError() returns "access denied" and not WSANOTINITALISED?
Does anyone with some experience know?
|
|
|
|
|
I have a function which is being passed a _TCHAR*. I need to find out how long the string is, but when I call sizeof( the_tchar ), it always returns 4, no matter what the string, which of course tells me that it is returning the size of the pointer, not the string. How do I get the length of the string being pointed to by the _TCHAR*?
|
|
|
|
|
|
if the return type of a function is defined as const CStringArray & and you define a local variable of that type, can you then call RemoveAll on the CStringArray to delete all entries? if not, would this cause a memory leak?
i.e.
const CStringArray & aszarray = foo(a,b)
aszarray.removall(). ????
|
|
|
|
|
|
How can I get this to compile? I am trying to get late binding to set the size of the char to the length of the document that I specify. But I keep getting the following errors, even when I declare the function virtual in the class definition. Here is the code sample:
void CMyClass::MyFunction(){
CFile myFile;
UINT uBytesRead;
CSting szText;
myFile.Open("File.txt",CFile::modeRead,NULL);
int nFileSize = myFile.GetLength();
char Buff[nFileSize];
while(uBytesRead = myFile.Read(Buff,nFileSize){
Buff[uBytesRead] = NULL;
szText += CString(Buff);
}
MessageBox(szText,"Thank you for your help",MB_OK);
}
My class definition:
class CMyClass : public CDialog
{
virtual void MyFunction();
}
Here are the errors I got when I tried to compile the program:
error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
If all you Herb Sutters and Tim Smiths can help me, I will be very greatful and wish you a long and healthy life. If you can read my code and suggest and alternate way of doing what I want it would be cool too.
|
|
|
|
|
you have to allocate this dynamically
char * Buff = new char[nFileSize];
....
delete [] Buff;
-c
Cheap oil. It's worth it!
|
|
|
|
|
So would this be the correct way to do it?:
void CMyClass::MyFunction(){
CFile myFile;
UINT uBytesRead;
CSting szText;
myFile.Open("File.txt",CFile::modeRead,NULL);
int nFileSize = myFile.GetLength();
char* Buff = new char[nFileSize];
while(uBytesRead = myFile.Read(*Buff,nFileSize){
*Buff[uBytesRead] = NULL;
szText += CString(Buff);
}
MessageBox(szText,"Thank you for your help",MB_OK);
}
|
|
|
|
|
actually, you need to add 1 to the length of the buffer, if you want to put the NULL on the end:
char* Buff = new char[nFileSize + 1];
then, before the MessageBox, you have to "delete [] Buff".
-c
Cheap oil. It's worth it!
|
|
|
|
|
Thank you for your help, it really helped me alot and got me to the solution.
void CMyClass::MyFunction(){
CFile myFile;
UINT uBytesRead;
CSting szText;
myFile.Open("File.txt",CFile::modeRead,NULL);
int nFileSize = myFile.GetLength();
char* pBuff = new char[nFileSize];
while(uBytesRead = myFile.Read((void*)pBuff,nFileSize){
Buff[uBytesRead] = NULL;
szText += CString(pBuff);
}
delete [] pBuff
MessageBox(szText,"Thank you for your help",MB_OK);
}
|
|
|
|
|
Hi,
I would like to know how I could go about writing a program that can record mouse clicks on a Excel Spreadsheet and sending the XY coordinates to a file?
Any ideas on how to begin?
Thanks, James Wong
|
|
|
|
|
You could use SetWindowsHookEx() to install a system wide WH_GETMESSAGE hook (inside a DLL), get the HWND of the window you want to track, filter out mouse message going to the window, and then send a custom message to your application to write this data to a file.
Check out this article:
http://www.codeproject.com/dll/hooks.asp
Good luck!
--
Dana Holt
Xenos Software
|
|
|
|
|
Hi:
There are two things that I am trying to achieve:
1) the default behaviour of the CListCtrl is that the user clicks the item he/she desires to edit once (to give it focus). Waits a little bit, and then clicks it again to start editing it. It the user simply double clicks on the unfocused item, it doesn't work. Any ideas how I can override this behaviour?
2) I have written the code that allows the user to right click the item. A menu pops up. The user selects "Insert ...". the code add a line above the focused line and gives focus to the new line. Until this point, it works beutifully. Then I would like the code to enter into the editing mode for the item (i.e., set the blinking cursor inside of the item - ready for keyboard input) without the user having to click the newly created item again. Here I have a problem. here is what I have got so far:
CDocUniverse* pDoc = (CDocUniverse*) GetDocument();
int nItem = pDoc->m_ViewUniverseListBox.GetNextItem(-1, LVNI_FOCUSED);
if (nItem == -1)
nItem = 0;
pDoc->m_ViewUniverseListBox.InsertItem(nItem, "", 0);
UINT uFlags = LVIS_SELECTED | LVIS_FOCUSED;
pDoc->m_ViewUniverseListBox.SetItemState(nItem + 1, 0, LVIS_SELECTED);
pDoc->m_ViewUniverseListBox.SetItemState(nItem, uFlags, uFlags);
// Send notification
CString str = pDoc->m_ViewUniverseListBox.GetItemText(nItem, 0);
LV_DISPINFO dispinfo;
dispinfo.hdr.hwndFrom = pDoc->m_ViewUniverseListBox.m_hWnd;
dispinfo.hdr.idFrom = pDoc->m_ViewUniverseListBox.GetDlgCtrlID();
dispinfo.hdr.code = LVN_BEGINLABELEDIT;
dispinfo.item.mask = LVIF_TEXT;
dispinfo.item.iItem = 0;
dispinfo.item.iSubItem = 0;
dispinfo.item.pszText = (LPTSTR)((LPCTSTR)str);
dispinfo.item.cchTextMax = str.GetLength();
GetParent()->SendMessage( WM_NOTIFY, pDoc->m_ViewUniverseListBox.GetDlgCtrlID(),
(LPARAM)&dispinfo );
Any ideas?
Thank you
|
|
|
|
|
Anton A. Loukine wrote:
Hi:
There are two things that I am trying to achieve:
1) the default behaviour of the CListCtrl is that the user clicks the item he/she desires to edit once (to give it focus). Waits a little bit, and then clicks it again to start editing it. It the user simply double clicks on the unfocused item, it doesn't work. Any ideas how I can override this behaviour?
Hi,
I think that you mean this:
void CMyDlg::OnLbnDblclkList()
{
int nCurSel = m_listBox.GetCurSel();
CString szCurSel;
m_listBox.GetText(nCurSel, szCurSel);
AfxMessageBox(szCurSel);
}
When a user doubleclicks an item in the list, a message box displays the selection.
After you should change the AfxMessageBox that is only for dimostrative purposes to something that fits your needs.
I hope this helps.
"Nelle cose del mondo non e' il sapere ma il volere che puo'."
|
|
|
|
|
I want to change the background colour of a button but am unable to do it. This button is attached to a class derived from CButton, and i want the code to reside in this class, not the dialogs class.
==================================================
When Your Mind Wonders...Where Does It Go???
|
|
|
|
|
Check out some of the owner-drawn button articles for ideas. You might be able to use one of them without modifications.
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
I think you can do it in Paint of this class.
Mazy
"The more I search, the more my need
For you,
The more I bless, the more I bleed
For you."The Outlaw Torn-Metallica
|
|
|
|
|
This is the best button you will ever get
Best regards,
Alexandru Savescu
|
|
|
|
|
|
thanks, i haven't had a good look at the code to see if I can incorporate it into my class, but it looks promising.
==================================================
When Your Mind Wonders...Where Does It Go???
|
|
|
|
|
Hi!
Does anyone has some ideas about dynamic software update ? (existing classes ...)
My purpose is to reduce effort while distributing a new release of the same software.
I just want to put the new version on a shared network directory, and force my software to update itself and its components (DLLs, exe files, config files ....)
What's the good way to add such a funtion ??
Thanks,
Vince
vince
|
|
|
|
|
You can use a class derived from WebResourceProvider to check for component (DLL) updates at run time.
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Checking updates at run time is not realy a strong effort !
My real need is to learn technicals about the way to force an exe file to auto-update.
|
|
|
|