|
You should use the COM interface provided for reading shortcuts, that way your code will still work if/when the file format changes in the future. Check out the CLSID_InternetShortcut coclass and IUniformResourceLocator , and the sample code in Q229092.
--Mike--
Ericahist | CP SearchBar v2.0.2 | Homepage | RightClick-Encrypt | 1ClickPicGrabber
#include "witty-quote.h"
|
|
|
|
|
Hi,
I've created a Socket (TCP/IP - Synchronous Socket - SOCK_STREAM) program in which I've spawned a new thread to accept client connections. Again, for every accepted connection through a new client socket, i've spawned another new thread for message transaction. Here, the Receive function does not block until the data is filled in the buffer. Instead, the receive function tries to read data which is either NULL or junk, which leads to assertion failure.
Is there any solution to make the client socket block untill receive? Or does a thread affect the state of the socket by any chance.
shenthil
senthilkkumar@rediffmail.com
|
|
|
|
|
The receive function of a connected socket is very much blocking provided you use CSocket::Receive or the Winsock API' recv (and not CAsyncSocket).
The reasons for a receive to not block might be:
1.The passed in data buffer is full with data
2.The connection went lost
So, check for the above.
Peter Molnar
|
|
|
|
|
I have never had problems with blocking sockets and threads. Anyway, I assume you are just using plain socket, accept and recv. If then the only thing that comes to mind is that you are mistaken the length of the buffer you are passing (the buffer you expect filled ) with the actual number of bytes read.
if you try something like this do you get to DebugBreak()?
int received = recv( s, buf, sizeof buf, 0 );
if( ( SOCKET_ERROR == received ) && (WSAEWOULDBLOCK == WSAGetLastError() ) )
{
//something has changed your socket to non-blocking mode
DebugBreak();
}
else
{
CopyMemory( workerBuf, buf, received );
//work with worker buf using the n received bytes
}
Hope this helps
Gabriel
Old C programmers never die. They just cast into void
|
|
|
|
|
Gabriel,
receive function (CSocket::Receive) neither returns SOCKET_ERROR nor WASEWOULDBLOCK ), rather it simply crashes out. even while debuggin, when the receive function returns, the application crashes.
shenthil
shenthil
|
|
|
|
|
Shenthil,
I would like to help but i just know about plain sockets. I don´t have any idea about how they work in MFC, even less what the problem could be.
About the subject of the original post (the socket not bloking,) CSocket inherits from CAsyncSocket which is asynchronous, and taking a quick glance at the code <sockcore.cpp> you can see CSocket simulates a blocking socket using a loop. But i don´t think this is the cause of the problem.
If your threads are just pumping bytes from a network connection and you need to work directly with them you are better off using and alternative to CSocket, because there is a lot of overhead in the way they work (asyncrhonous notifications through a windows message queue) which was the only option when they appeared in win3.1 because the apps were single threaded and there was no real multitasking in the OS
Gabriel
Old C programmers never die. They just cast into void
|
|
|
|
|
Gabriel,
How to stop the Thread from Pumping Messages.
Shenthil
Shenthil
|
|
|
|
|
Shenthil,
If you refer to stop pumping the messages that are sent to you over the network, unless you call Receive or recv, the data is going to stand still until your winsock implementation runs out of network buffer space.
If you refer to message pumping from the window queue as Receive does, this is not desirable because this is intrinsic to the mechanism CSocket uses.
Here at CP in the Internet & Networking section you have plain sockets programming tutorials and classes, and also MFC CSocket derived classes. (Nish has written great tutorials on sockets)
I´m biased but IMHO CSocket misuses resources and adds uneeded complexity.
Hope this helps
Gabriel
Old C programmers never die. They just cast into void
|
|
|
|
|
Thanks Gabriel. Now I've changed the algorithm, but the problem is still unsolved.
Shenthil
|
|
|
|
|
Is your app still crashing? What´s the error? Access violation?
Gabriel
Old C programmers never die. They just cast into void
|
|
|
|
|
I've just changed my application as a peer-to-peer one, instead of supporting multi-clients simultaneously.
shenthil
|
|
|
|
|
I want Disable/Lock keyboard and mouse, but i don`t know how to do it ?
TNX
|
|
|
|
|
Have you looked around codeproject? There are several acticles/totorials that may help you figure out how to do this. Do not ignore the various aticles on user interfaces, many of these use local/systems hooks to accomplish their task.
What you need is to look at the articles/totorials on hooking.
INTP
|
|
|
|
|
I want Disable/Lock keyboard and mouse, but i don`t know how to do it ?
TNX
|
|
|
|
|
please let me know how can i make the program wiondow which cannot be adjusted, moved and closed by the user if I have to use WS_OVERLAPPEDWINDOW parameter in CreateWindowEx(). Initally, the program window should be in largest size.
HRESULT MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE ; // disable the close icon
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_PLANTMONSYS); //IDI_PLANTMONSYS
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL; // Disabled (LPCSTR)IDC_PLANTMONSYS;
wcex.lpszClassName = ClassName;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HANDLE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindowEx(
WS_EX_TOPMOST,
ClassName, /* name of window class */
TEXT("Plant Monitoring System (Final Year Project 2002-2004)"), /* title that shown on the window */
WS_OVERLAPPEDWINDOW | WS_VISIBLE , /* window style - normal // WS_OVERLAPPEDWINDOW | WS_VISIBLE|WS_POPUP no Heading |WS_SYSMENU Menu`*/
CW_USEDEFAULT, /* X coordinate - let Windows to decide */
CW_USEDEFAULT, /* Y coordinate - let Windows to decide */
cxScreen, /* width - let Windows to decide */
cyScreen, /* height - let Windows decide */
NULL, /* no parent window */
NULL, /* no menu */
hInstance, /* handle of this instance of the program */
NULL /* no additional arguments */
);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, SW_MAXIMIZE ); // max size ,nCmdShow
UpdateWindow(hWnd);
return TRUE;
}
Regards,
Anson
|
|
|
|
|
I beleive there are some articles/totorials on this subject here a codeproject and there may be some information in the FAQs. There is also some information in the MFC library, on this subject.
What I do know is that most of your problems will be solved by using a full screen window (information in MFC library). You will probably need to filter WM_SIZE, WM_MOVE, WM_KEYDOWN, and any other messages that would normaly allow the user to size, move, or close the window.
Good Luck!
INTP
|
|
|
|
|
Looking for information relating sending sms messages with a phone over serial port in PDU mode with Visual,can anyone help?;)
nolan
|
|
|
|
|
There's a standard set of AT commands defined precisely to do so. Google for "GSM 07.05" (this is the name of the standard.) The commands are not trivial to use at first, you will have to carefully construct some rather messy data structures, but the standard defines them with great precision.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
|
Hello!
Is it possible to check if something is typedef'd already?
For example VC++ 5.0 doesn't know the TRIVERTEX structure. A normal #ifndef TRIVERTEX doesn't work in VC++ 2k3 because it has been declared with typedef and not with #define. So VC++ 2k3 will throw a redeclaration error.
Any idea?
Dominik
_outp(0x64, 0xAD);
and
__asm mov al, 0xAD __asm out 0x64, al
do the same... but what do they do??
(doesn't work on NT)
|
|
|
|
|
Hmmm.
The simplest suggestion is to check that the header file "guard" that includes that typedef hasn't been defined
eg, in "standardfile.h":
#ifndef STANDARD_FILE_H<br />
#define STANDARD_FILE_H<br />
<br />
typedef TheTypeIWant;
<br />
#endif
and in "yourfile.h"
#ifdef STANDARD_FILE_H<br />
#else<br />
#endif
This would be a somewhat brittle approach though. If this is part of a cross-platform application, you might want to the more traditional approach of defining necessary types within code blocks for the specific platform. If you need to build something with VC++5.0 and 2003, then treat them as specific platforms but via the compiler versions
(I think it's VC_VER, off the top of my head - but it's in the headers - 2003 is VC-VER 1300, IIRC, and VC++5 is 1100)
HTH
--
Ian Darling
"The moral of the story is that with a contrived example, you can prove anything." - Joel Spolsky
|
|
|
|
|
You can always use
#if VISUAL_STUDIO_NET
__if_not_exists(TRIVERTEX) {
struct TRIVERTEX {
...
}
}
#endif
__if_not_exists and __if_exists are VS.NET-features only I believe, hence the #ifdef VISUAL_STUDIO_NET (which should be replaced with something correct )
--
Must I be the meat in an imbecill sandwich?
|
|
|
|
|
Jörgen Sigvardsson wrote:
which should be replaced with something correct
And what would that correct thing be? _MSC_VER to 8 or so? What is _MSC_VER for VS2k3.NET?
Dominik
_outp(0x64, 0xAD);
and
__asm mov al, 0xAD __asm out 0x64, al
do the same... but what do they do??
(doesn't work on NT)
|
|
|
|
|
#if _MSC_VER >= 1300 should do the trick
--
Must I be the meat in an imbecill sandwich?
|
|
|
|
|
I am wiritng an MFC\C++ code and using DOM while working with a web browswer - the problem is that retrieving string from the html page - they include strange characthers in the fomat %xx - how do I eliminate those?
|
|
|
|