|
morning, all
I am looking at this code
CB_DBF_NTX* const p = OpenDbfNtxHelper( szDbfName, szIndexName, szIndexKey );
the P has value 0XCCCCCCC, if I do F10, it goes to
CB_DBF_NTX* pDbf = new CB_DBF_NTX( const_cast<char*>( szDbfName ) );
pDbf also has value 0xCCCCCCC.
does it mean p and pDbf BOTH need to be initialized or just pDbf?
thanks!
|
|
|
|
|
0xCCCCCCCC indicates an uninitialized local variable. If OpenDbfNtxHelper() fails, does it return a NULL pointer?
"One must learn from the bite of the fire to leave it alone." - Native American Proverb
|
|
|
|
|
thanks for your reply.
it will be returned void. and the OpenDbfNtxHelper will returned the valid adress.
so "0xCCCCCCCC indicates an uninitialized local variable", means oxCCCCCCC doesn't necessary cause moemory leak? thanks again!
|
|
|
|
|
valerie99 wrote:
so "0xCCCCCCCC indicates an uninitialized local variable", means oxCCCCCCC doesn't necessary cause moemory leak? thanks again!
never make that assumption.
every time you declare a pointer assign NULL to it; then you will be in better position to debug those kind of problems ( for example by using ASSERT )
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
In this case
valerie99 wrote:
CB_DBF_NTX* const p = OpenDbfNtxHelper( szDbfName, szIndexName, szIndexKey );
the function probably fails and returns no pointer, but NULL .
In this case
valerie99 wrote:
CB_DBF_NTX* pDbf = new CB_DBF_NTX( const_cast( szDbfName ) );
pDbf should be a pointer on a new CB_DBF_NTX object, but the init also fails and returns NULL .
So the fact that both p and pDbf have a value of 0xCCCCCCC only shows that both pointers have the value NULL and are unititialized, but not that they are linked together in any way.
So the anwser to
valerie99 wrote:
does it mean p and pDbf BOTH need to be initialized or just pDbf?
is "Yes, both p and pDbf need to be initialized".
Check why your function OpenDbfNtxHelper and why the constructor CB_DBF_NTX fail (this has probably to do with szDbfName , which is common to both of the statements).
~RaGE();
|
|
|
|
|
remove the const, and do it in multiple instructions ( just for test ).
CB_DBF_NTX* p = NULL;
p = OpenDbfNtxHelper( szDbfName, szIndexName, szIndexKey );
ASSERT( p );
If p after the call to OpenDbfNtxHelper is still 0xffffffff check that the input to the function are valid.
Also, ALWAYS check that the pointers are valid, (before and) after an allocation with ASSERT .
usually, new will not fail.
are you certain you are running in DEBUG mode ?
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
valerie99 wrote:
I am looking at this code
CB_DBF_NTX* const p = OpenDbfNtxHelper( szDbfName, szIndexName, szIndexKey );
the P has value 0XCCCCCCC, if I do F10, it goes to
If you look at the value of p , while the instruction pointer is at this line, then you are seeing the value before this line has executed ; the value of p at this time is irrelevant. You need to look at the value of p after pressing F10
--
jlr
http://jlamas.blogspot.com/[^]
|
|
|
|
|
|
char szDescription[200];
BOOL bValid;
bValid= AfxIsValidString(szDescription, 400);
//bValid is TRUE, shouldn't it be FALSE?????????/
thanks
|
|
|
|
|
McGahanFL wrote:
...shouldn't it be FALSE?????????/
What makes you think so? This function tests the memory address to ensure that it is contained entirely within the program’s memory space.
"One must learn from the bite of the fire to leave it alone." - Native American Proverb
|
|
|
|
|
DavidCrow wrote:
This function tests the memory address to ensure that it is contained entirely within the program’s memory space.
I thought this was AfxIsValidAddress() , or maybe does AfsIsValidString call AfxIsValidAddress() ?
Anyway, I can understand that defining a string of 200 chars, and getting true when checking if it is valid for 400 chars is a bit disturbing, especially since the MSDN states :
Nonzero if the specified pointer points to a string of the specified size; otherwise 0.
~RaGE();
|
|
|
|
|
I hate it when that happens. I was looking at AfxIsValidString() on my local MSDN, but then somehow started looking at AfxIsValidAddress() on MSDN online. Thanks.
"One must learn from the bite of the fire to leave it alone." - Native American Proverb
|
|
|
|
|
Thank you for your effort.
|
|
|
|
|
Thank you for verifing what seems reasonable.
|
|
|
|
|
Well, what is IN the szDescription, since you did not initialize it to anything?
There might be at least one NUL byte within the 400 or so off the stack, in which case the 'length' of the string was less than or equal to 400 bytes. So the test passed, this time...
I would not ever use AfxIsValidSring unless you had actually placed (or at least suspected one had been) a zero-terminated string into the variable first.
|
|
|
|
|
Thank you for your reply.
The -1 parm looks for NULL terminated, otherwise it is documnented that it verifies the length.
In any event, there is no test set of data that will fail this test other than a NULL pointer.
|
|
|
|
|
AfxIsValidString can only verify that the string is readable. If you happen to pass in garbage that contains no \0 character, then it will return an error. However, in your case, even if there were no \0 characters in the first 200 bytes, the memory past the end of the string is probably readable and thus will not generate an error.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
thank you, that is a reasonable explanation
|
|
|
|
|
Hi!
I just created a control with the dialog designer in Visual Studio (added dialog resource and set the Control property to true - adds DS_CONTROL flag). How do I make this control part of a window that I create with CreateWindow()?
Thanks already in advance!
|
|
|
|
|
Create a new instance of the control that you created and give the parent window of the control as the one that you created with the createwindow.
-prakash
|
|
|
|
|
That's exactly what I'm already doing. I create a new HWND with CreateDialogParam() and specify my parent window handle as hWndParent. Yet the newly created HWND is NULL and GetLastError() returns 0 ( ).
Here is an exerpt of the .rc file:
IDD_PVIEWERPANE DIALOGEX 0, 0, 443, 154<br />
STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE<br />
FONT 8, "MS Shell Dlg", 400, 0, 0x1<br />
BEGIN<br />
GROUPBOX "Photo information",IDC_STATIC,7,7,429,140<br />
LTEXT "Title:",IDC_STATIC,13,32,44,8<br />
LTEXT "Static",IDC_TITLE,61,32,98,8<br />
LTEXT "Time taken:",IDC_STATIC,191,32,62,8<br />
LTEXT "Static",IDC_TIMET,255,32,118,8<br />
LTEXT "Path:",IDC_STATIC,13,47,34,8<br />
LTEXT "Static",IDC_PATH,55,47,381,8,SS_ENDELLIPSIS<br />
LTEXT "Dimensions:",IDC_STATIC,13,61,67,8<br />
LTEXT "Static",IDC_DIMENSIONS,81,61,120,8<br />
LTEXT "Zoom factor:",IDC_STATIC,228,61,79,8<br />
LTEXT "Static",IDC_ZOOMF,315,61,98,8<br />
CONTROL "",IDC_RICHEDIT21,"RichEdit20A",ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP,7,78,429,69,WS_EX_CLIENTEDGE<br />
PUSHBUTTON "< Previous",IDC_BPREV,13,17,79,14<br />
PUSHBUTTON "Next >",IDC_BNEXT,357,17,79,14<br />
END<br />
<br />
...<br />
<br />
IDD_PVIEWERPANE, DIALOG<br />
BEGIN<br />
LEFTMARGIN, 7<br />
RIGHTMARGIN, 436<br />
VERTGUIDE, 13<br />
TOPMARGIN, 7<br />
BOTTOMMARGIN, 147<br />
HORZGUIDE, 17<br />
HORZGUIDE, 31<br />
HORZGUIDE, 40<br />
END<br />
...
... and here's my code:
HWnd = CreateWindow(C_PHOTOVIEWER, "", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, PANEWIDTH, 500, NULL, NULL, hInst, NULL);<br />
SetWindowLongPtr(HWnd, GWLP_USERDATA, (LONG_PTR) this);<br />
hPane = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_PVIEWERPANE), HWnd, this->DlgProc, (LPARAM) this);<br />
ShowWindow(HWnd, SW_SHOW);<br />
|
|
|
|
|
I began to read serial communication in Win32 from MSDN. but it confused me.
It dispatched me to synchronization, threads, multithreading, ... ???!!!
the first problem I should ask is what is a thread? what is difference between thread and functions?
and can you give an example of what is the benefit of multithreading?
|
|
|
|
|
Hello,
Fear not fellow programmer for we are here to help you on your quest!
A shall explain briefly what a thread is. You can start exploring this[^] part of MSDN for more information.
A thread is an object in your process that can be sheduled by the OS to take a slice of processor time. The code that is executed is executed parallel with other code of your process. So basically, if you write a multithreaded application, multiple parts (threads) of your application are running at the same time.
By default, your application has just one thread that executes everything after eachother. If you have background tasks or other things that require the user interface to be blocked a long time (such as serial communication), threads are a solution. This object runs seperately from your other code, and therefore cannot block the user interface.
The difference between an normal function and a thread is the way it is executed. A normal function is called by an other part of your code, does its trick and then returns to the caller. When the function is executed, it blocks the caller until it has finished its task.
A thread is also a function, but this function doesn't get called by your code (you can, but normally people don't do this). This function is called by the OS when the thread object is started. It behaves just like the main function. The only difference is that you have to watch out with synchronization and other problems that come with multithreading.
There are some thread classes here on CP that can save you a lot of work. Search for thread and you will find enough information about this stuff.
Hope this helps.
Behind every great black man...
... is the police. - Conspiracy brother
Blog[^]
|
|
|
|
|
A CONNECT PROBLEM WITH CSocket
I have what I think is some very simple CSocket code for a client and a server,
but I'm having difficulty getting it working since it occasionally locks up.
Any advice would be greatly appreciated.
Here's the situation:
I have a client program and a server program. I start them both up, assuring
that the server starts up first and is waiting and ready for the client. They
are both running on the SAME MACHINE.
ON THE CLIENT SIDE
When the client program is started it successfully makes a connection to the server,
sends a simple (command) string to the server, and then retrieves (data) strings
from the Server until it retrieves a special (ENDOFDATA) string from the Server that
indicates that all data has been sent. The Client then sends a final (ENDOFTRANSACTION)
string to the Server, notifying the Server that the whole transaction
is completed and so that the server knows that it can safely close the connection.
ON THE SERVER SIDE
The Server is set up and does its Accept, waiting for a connection from the Client.
When it suceeds in the Accept it then does a ReadString of the first (Command) string from
the Client. The Server then sends the several (data) strings to the Client, followed by
the sending of an (ENDOFDATA) string to the Client. The Server then does another ReadString,
waiting for the (ENDOFTRANSCATION) string from the Client. When the Server receives that
(ENDOFTRANSCATION) string the Server then closes its side of the connection.
And I do this over and over again, testing the connections and the ability
to successfully transfer data betwen the Client and Server. Generally it
works, but not always.
FAILING
When it fails, it does so as follows:
1) The Client enters the Connect method.
2) The Server does indeed Accept the connection from the Client.
3) The Server successfully sets up the sending and receiving Archives.
4) The Server then does the ReadString, waiting to read the initial (Command) string from the Client.
5) But the Server never gets the (Command) string. It waits forever inside the ReadString.
Debugging reveals that the Client is STUCK WITHIN THE Connect METHOD.
Although he Client has performed enough of the Connect method in order to actually establish the
connection (made clear by the fact that the Server Accepts the connection, successfully
establishes the related Archives and starts up the ReadString method) the Client
never does actually complete the processing of the Connect method.
So, the Server is left hanging, waiting for the (Command) string from the Client,
which will never come because the Client never finishes processing the Connect method.
And there it waits, never completing the operations.
Oddly, it works most of the time. If I include TRACE statements in the code it seems to work
more often than if there are no TRACE statements. Also, if I only send a tiny bit of data
(one or two strings) from the Server to the Client then it works more often than if I transfer
lots of strings. But it always inevitably, randomly fails.
Debugging reveals that the place where it's "stuck" is inside the CSocket::ConnectHelper
method,as follows;
BOOL CSocket::ConnectHelper(const SOCKADDR* lpSockAddr, int nSockAddrLen)
{
if (m_pbBlocking != NULL)
{
WSASetLastError(WSAEINPROGRESS);
return FALSE;
}
m_nConnectError = -1;
if (!CAsyncSocket::ConnectHelper(lpSockAddr, nSockAddrLen))
{
if (GetLastError() == WSAEWOULDBLOCK)
{
while (PumpMessages(FD_CONNECT)) << GETS STUCK IN THIS LOOP
{
if (m_nConnectError != -1) << ALWAYS RETURNING m_nConnectError = -1
{
WSASetLastError(m_nConnectError);
return (m_nConnectError == 0);
}
}
}
return FALSE;
}
return TRUE;
}
- - - - - - MY CODE follows
The code below shows the basic, stripped-down versions of the client and server programs.
What am I doing wrong?
// CLIENT CODE
AfxSocketInit();
int nNumberOfTransactions;
for (nNumberOfTransactions = 0 ; nNumberOfTransactions < 1000; ++nNumberOfTransactions)
{
CSocket ClientSocket;
int nPortNumberClient = 0; // 0 means for MFC to select an available port
if (ClientSocket.Create(nPortNumberClient))
{
int nPortNumberServer = 49153;
// Connect to the Server
if (ClientSocket.Connect("68.171.26.117", nPortNumberServer)) // <<< GETS TO HERE AND STOPS
{
CSocketFile SocketFile(&ClientSocket);
CArchive ArchiveSending(&SocketFile, CArchive::store);
CArchive ArchiveReceiving(&SocketFile, CArchive::load);
// Send "GiveMeData" (Command) string to the Server
ArchiveSending.WriteString("GiveMeData\n");
ArchiveSending.Flush(); // to assure sending of the data.
// Get response from Server
while (TRUE)
{
CString strResponse;
ArchiveReceiving.ReadString(strResponse);
if (strResponse.CompareNoCase("ENDOFDATA\n")==0)
{
break;
}
else
{
// It's actual data, do something withit
}
}
ArchiveSending("ENDOFTRANSACTION);
ArchiveSending.Flush();
ArchiveReceiving.Close();
ArchiveSending.Close();
SocketFile.Close();
}
else
{
// Connection failure.
}
}
else
{
// Failed to Create the CSocket.
}
}
///////////////////////////////////////
and here's the server code
///////////////////////////////////////
// SERVER CODE
AfxSocketInit();
CSocket SocketServer;
int nPortNumberServer = 49153;
if (SocketServer.Create(nPortNumberServer, SOCK_STREAM, "68.171.26.117"))
{
if (SocketServer.Listen(5))
{
while (TRUE)
{
// Accept the connection.
CSocket sockRecv;
if (SocketServer.Accept(sockRecv))
{
// Create a file object
CSocketFile file(&sockRecv);
// Create a receiving stream.
CArchive ArchiveReceiving(&file, CArchive::load);
// Create a sending stream.
CArchive ArchiveSending(&file, CArchive::store);
// Get (Command) string that was sent from Client
CString strCommand;
ArchiveReceiving.ReadString(strCommand); // GETS TO HERE AND STOPS
// In response to (Command) string from Server, send Data back to Client
int nCounter;
for (nCounter = 0 ; nCounter < 1000 ; ++nCounter)
{
ArchiveSending.WriteString("Data\n");
}
ArchiveSending.Flush();
// Tell Client that all data has been sent
ArchiveSending.WriteString("ENDOFODATA\n");
// Wait for acknowledgement ("ENDOFTRANSACTION") from Client
// so that I know it's safe to Close
CString strEndOfTransaction;
ArchiveReceiving.ReadString(strEndOfTransaction);
ArchiveReceiving.Close();
ArchiveSending.Close();
}
else
{
// Failed to accept the connection
}
}
}
else
{
// Failed to listen
}
}
else
{
// Failed to create the main socket
}
Roger Garrett
|
|
|
|
|
This is a question only .NET beginner could ask, and I'm sure the answer will be simple.
The background info:
I have an VC++ (MFC) application that I wrote in VS2002. One of the several DLLs that comprise this application is a managed code Crystal Reports viewer. I have created a setup project to make an MSI from all the project outputs from this and the other projects.
The problem:
When I compile this application using VS2002, everything works as expected, and my MSI file has a file size of roughly 11MB. When I compile this application using VS2003, the Crystal Reports viewer quits working, giving me a "Common Language Runtime" error when I attempt to open it, and the MSI file has a file size of roughly 3MB. Also, the Crystal Reports viewer works fine when the application is installed on my development pc, but doesn't work on any other pc I've tried, even if the other pc has the newest .NET Framework installed. My obvious conclusion is that some vital .NET component is being compiled into the VS2002 MSI file, but is not being compiled into the VS2003 MSI file.
I have made sure that the Crystal Reports viewer project has all the correct .NET references specified. I don't know what else to try.
Any suggestions???
|
|
|
|
|