|
Hey everyone. I'm trying to get the CInternetSession class do asynchronous fetching of web pages and I'm having some troubles. I have my class derived from CInternetSession (cleverly named "IgnorantInetSession" since it should essentially ignore results) and I keep getting assertion errors when the object is initialized. The class declaration is:
class CIgnorantInetSession : public CInternetSession
{
public:
CIgnorantInetSession(LPCTSTR pstrAgent = NULL,
DWORD dwContext = 1,
DWORD dwAccessType = PRE_CONFIG_INTERNET_ACCESS,
LPCTSTR pstrProxyName = NULL,
LPCTSTR pstrProxyBypass = NULL,
DWORD dwFlags = 0);
virtual ~CIgnorantInetSession();
void CIgnorantInetSession::OnStatusCallback(DWORD_PTR dwContext,
DWORD dwInternetStatus, LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength);
};
In the constructor, I call EnableStatusCallback(TRUE); - this throws the asssertion problem. The function implementing the callback looks like so:
void CIgnorantInetSession::OnStatusCallback(DWORD_PTR dwContext,
DWORD dwInternetStatus, LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength)
{
CInternetSession::OnStatusCallback(dwContext, dwInternetStatus,
lpvStatusInformation, dwStatusInformationLength);
}
Does anyone know what's going on here? Thanks!
Luke Reeves (LukeyBoy)
luke@oceanlake.com
|
|
|
|
|
Accoring to MSDN, to handle any operations asynchronously, three conditions must be set: - In the constructor, dwFlags must include
INTERNET_FLAG_ASYNC .
- In the constructor,
dwContext must be set to one.
- You must establish a call back function by calling
EnableStatusCall() . /ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Yeah, I do exactly that. The call to the constructor is:
CIgnorantInetSession session(0, 1, PRE_CONFIG_INTERNET_ACCESS, 0, 0, INTERNET_FLAG_ASYNC);
session.EnableStatusCallback(TRUE);
It should work just fine, but it still doesn't.
|
|
|
|
|
Where does it assert?
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
|
That's not helpful. Please post the exact condition that asserted. My INET.CPP line 415 is the arglist of the constructor.
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Debug Assertion Failed is the message, then a generic RTFM blurb. The actual assert statement is:
ASSERT((dwFlags & INTERNET_FLAG_ASYNC) == 0);
|
|
|
|
|
I recall this annoying problem - caused by bogus MS doc. Hang on a sec while I find my fix...
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Can you try using INTERNET_OPEN_TYPE_PROXY instead of INTERNET_FLAG_ASYNC ?
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
This[^] is the query similar to yours. I wish MS would fix their online docs.
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Still no go. Now I get an assert error in inet.cpp, 645 (when I enable the callback). The line is:
ASSERT(!m_bCallbackEnabled);
|
|
|
|
|
Ugh. I'm going to dig some more...
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Here's[^] an alternate approach. I'm still looking for the fix...
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Apparently asynch support in CInternetSession has gone away. See this MSDN link[^].
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Humor me one more time. Can you try this:
CMyInternetSession::CMyInternetSession()
: CInternetSession
("FooBar", 1, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0)
{
EnableStatusCallback (TRUE);
} /ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Seems to work for me! My callback gets called.
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
You're gonna hate me... but it still doesn't work . Several callback events get fired correctly, but then an assertion fails again that looks like:
ASSERT(m_bCallbackEnabled != NULL);
And the bigger problem is that the call now isn't asynchronous - it blocks the whole process until the callback events. Ouch. If I can't figure this out I'm never gonna touch MSVC again!!! Just kidding.
|
|
|
|
|
I fear I was too quick to claim success.
Callbacks are indeed supported, but apparently MS never got around to making CInternetSession asynch. I suppose the only way to do asynch downloads (using CInternetSession ) is by using threads. But this CP article[^] may shed more light than I was able to provide.
Good luck!
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
That's probably the easiest way in the end. Thanks for all the help Ravi!
|
|
|
|
|
I need to encode a .exe file in order to put its content into some XML's CDATA. Is there any code here on CP handling such task?
rechi
|
|
|
|
|
If you're not searching for any particular encoding mechanism, one of the simplest is to substitute every byte by its representantion in hexadecimal. Doing such a coder/encoder is trivial.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
i have made a help file by using help tool provided by microsoft visual tools.
now i want to include that in my project . please tellme how to include those files in the project,
thanks
looking forward from all the gurus of code
|
|
|
|
|
You'll find an abundance of information here[^].
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
I have an OCX that I wrote containing two controls: a serial port enumerator (gives a list of the available serial ports on a system), and a serial port control (does the communications, event firing etc). The enumerator doesn't have any properties (just 1 method that returns a SAFEARRAY of BSTRs with port names). The serial port control has the usual serial port properties (baud rate, parity, handshaking, data bits, stop bits, and which events the user wants notification of). In the InitDialog function of the Serial port's property page, I wanted to use the Enumerator to fill in a combo box with the port names. However, when I try this, it gives an exception and crashes whatever container it is in. Here is how I am trying to create the enumerator control:
<br />
BOOL CSerialPortPropPage::OnInitDialog() <br />
{<br />
COlePropertyPage::OnInitDialog();<br />
CWnd wndEnum;<br />
CRect rc;<br />
<br />
rc.SetRect(0, 0, 0, 0);<br />
if (FALSE == wndEnum.CreateControl(_T("SERIALPORT.SerialEnumeratorCtrl.1"), NULL, 0, rc, this, 5000))<br />
AfxMessageBox("Enumerator Creation failed!");<br />
else<br />
AfxMessageBox("Enumerator Creation Passed!");<br />
<br />
return FALSE;
Is there something I am doing wrong (I've been looking at it way too long . . . everything looks okay to me, but it still isn't working).
If this isn't correct, does anyone have a better way of accomplishing this?
Thanks
Zac Howland
"If I create everything new, why would I want to delete anything?"
|
|
|
|
|
Did you call AfxEnableControlContainer() ?
As my daughter would say, "... Whatever!"
|
|
|
|