|
DWebBrowserEvents2::DocumentComplete fires only after all lower-level frames have been loaded (in the case of a frameset). So using a state variable is still the way to go, but you'll actually want to store the URL being requested initially and compare that with the URL passed through the event arguments. If they are the same, your frameset is loaded.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi gurus,
it's me again.
My question is simple.
How can I create a thread in C#?
I would like to call DirectPlay functions in a thread.
The thread would manage all connections: Hosting/Connecting/enumerating/disconnecting sessions etc.
Because when I use the Peer's methods like Host, Connect etc. the interface do not answer anymore. The application look frozen.
I could do this in MFC but C# is different...
Thanks for the help.
best regards.
There is no spoon.
|
|
|
|
|
bouli wrote:
How can I create a thread in C#?
A thread in C# needs a delegate for a void method without any parameters:
<br />
Thread thread = new Thread(new ThreadStart(doSomething));<br />
thread.Start();<br />
In this example doSomething runs in the new thread. If the thread needs parameters, you have to use instance variables.
|
|
|
|
|
Hi,
I'd like to monitor the sites a user visits, so i'd like to log all the url's visited by a particular user!
Would it be possible to copy the url as soon as the user hits enter after typing in the url or am i going to have to copy the url from the browser cache or history!
Can some please help me out with the source code to do this , no matter what way you choose to do it!
Thanx 4 the help ..!
|
|
|
|
|
This is best done by using a Browser Helper Object (BHO). An old article on MSDN describing BHOs uses just the example you're looking for, except that instead of logging the URL it displays the content of the page when the document is done download. Read Browser Helper Objects: The Browser the Way You Want It[^]. If you need further help on this, please visit the VC++ forum here on CodeProject.
You can write a BHO using C#, but you need to declare a lot of interop'd interfaces and perform a lot of marshaling. Sorry to say, based on how you phrased your question you may have more problems with this. Besides, when you're hooking a majority of the events on DWebBrowserEvents2 , you need to be quick. Managed code can be faster than native code, but when a lot of marshaling is involved, you'll find that performance is quite a bit slower.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi gurus,
How can I create my own event and fire it in C#?
example code:
this following is taken from DirectX SDK DirectPlay tutorii
this event is fired by the Peer.FindHosts method
<br />
public void FindHostResponseHandler(object sender, FindHostResponseEventArgs args)<br />
{<br />
HostInfo Node = new HostInfo();<br />
Node.GuidInstance = args.Message.ApplicationDescription.GuidInstance;<br />
Node.HostAddress = (Address) args.Message.AddressSender.Clone();<br />
Node.SessionName = args.Message.ApplicationDescription.SessionName;<br />
<br />
if (!FoundSessions.Contains(Node))<br />
{<br />
FoundSessions.Add(Node);<br />
}<br />
}<br />
Thanks for the help.
best regards.
There is no spoon.
|
|
|
|
|
The correct way is to define a delegate that extends EventHandler , or use an existing one (depending on whether or not a particular delegate declares a param with an EventArgs -derivative that suits your needs).
Raising Events[^] in the .NET Framework SDK explains the recommended way of firing events, which includes declaring a delegate and EventArgs derivative (like I said, if necessary), declaring the event on your class, and making a protected virtual member named OnEventName that actually fires the event (so that derivative classes can either override it to handle events without a delegate (faster, with more control) or raise the event themselves).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
You've been faster again! This is the second time today that I write an answer to a new question, and when it is posted your answer is already there.
BTW: It's not necessary to derive from EventArgs . FxCop wants me to do so, but where is the real benefit?
|
|
|
|
|
It's just common for events. You're right, though, it's not necessary. Commonality, though, fosters better programming for those (few these days, it seems) that recognize the pattern.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
ok, I've got it... thanks
I start to understand the way it works.
it's even more simple than MFC... :P
There is no spoon.
|
|
|
|
|
Hi Heath,
I was looking that way... Delegates. it seems they look like callbacks.
I can declare my delegate, but I don't understand yet how to use it in my class.
I have done the following:
<br />
class PeerPlayer<br />
{<br />
...<br />
public delegate void HostFound(HostInfo node);<br />
<br />
public void FindHostResponseHandler(object sender, FindHostResponseEventArgs args)<br />
{<br />
HostInfo node=new HostInfo();<br />
<br />
node.GuidInstance=args.Message.ApplicationDescription.GuidInstance;<br />
node.HostAddress=(Address) args.Message.AddressSender.Clone();<br />
node.SessionName=args.Message.ApplicationDescription.SessionName;<br />
<br />
if (!m_sessions.Contains(node))<br />
{<br />
m_sessions.Add(node);<br />
}<br />
}<br />
...<br />
}:((<br />
There is no spoon.
|
|
|
|
|
Did you read the article I linked? It's really quite clear.
A delegate is a managed function pointer. By declaring an event on your class, you in effect declare a MulticastDelegate that maintains a list of delegates. When you invoke your event delegate, any handlers are called in any given order.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
ok, I can fire my event now
but I don't understand how I can use it outside of the class...
PeerPlayer pp=new PeerPlayer();
pp.HostFound+=new??? // new what???
I have implemented a HostFound handler in the form class.
There is no spoon.
|
|
|
|
|
bouli wrote:
// new what???
Use whatever delegate declared by the event. So if you declared public event EventHandler HostFound , then use new EventHandler(myhandler) .
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
ok, I've got it
the delegate was inside the PeerPlayer class.
I have done the following now:
pp.HostFound+=new HostFoundHandler(OnHostFound);
and it works
I'm now working on how to write the calls of the DirectPlay connections in a thread.
I would like to execute the following code in a thread:
<br />
public bool Enumerate(String hostName)<br />
{<br />
m_sessions.RemoveRange(0, m_sessions.Count);<br />
<br />
Address hostAddress=new Address();<br />
<br />
hostAddress.ServiceProvider=Address.ServiceProviderTcpIp;<br />
<br />
if (hostName.Length > 0)<br />
hostAddress.AddComponent(Address.KeyHostname, hostName);<br />
<br />
hostAddress.AddComponent(Address.KeyPort, m_port);<br />
<br />
ApplicationDescription appDesc=new ApplicationDescription();<br />
<br />
appDesc.GuidApplication=m_appGuid;<br />
<br />
try<br />
{<br />
m_peer.FindHosts(appDesc, hostAddress, m_localAddress, null, 0, 0, 0, FindHostsFlags.Sync);<br />
}<br />
catch(Exception ex)<br />
{<br />
Debug.WriteLine(ex.Message);<br />
return false;<br />
}<br />
<br />
return true;<br />
}<br />
There is no spoon.
|
|
|
|
|
If the event needs parameters, you can define your own delegate:
<br />
public delegate void MyEventHandler (object sender, HostInfo details);<br />
public event MyEventHandler MyEvent;<br />
To fire your event, just call it as if it was a method:
<br />
if(MyEvent != null){<br />
MyEvent(this, Node);<br />
}<br />
|
|
|
|
|
Do you always need to declare an event with a delegate?
as I come from MFC, if I understand well, it seems that delegates are to C# what callbacks are to C/C++...
There is no spoon.
|
|
|
|
|
1) There are a couple pre-defined delegates (EventHandler, CancelEventHandler, and so on). If you need other parameters, you have to define a delegate.
2) Exactly. There are no "official" callback in C#, they have been replaced by delegates.
|
|
|
|
|
ok, I understood how it works... thanks
it's more simple than MFC...
There is no spoon.
|
|
|
|
|
oh, yes, one more thing,
how the caller of the event can use the fired event???
I have done this:
class PeerPlayer
{
public delegate void HostFoundHandler(HostInfo node);
public event HostFoundHandler HostFound;
...
}
...
PeerPlayer=pp=new PeerPlayer();
...
pp.HostFound+=????
There is no spoon.
|
|
|
|
|
I'm writing instalation program that creates web application. Before this could happen, IIS must be installed on the machine. If it is not, I would like to show warning message and gracefully end the installation process.
How can I check programatically if IIS is installed ?
Thank You
Michał
|
|
|
|
|
If you use the Windows Installer project in VS.NET, you can create a Web Project that does this already. If IIS is not installed, it will display an error and exit.
There are many ways of determining if IIS is installed, from checking for the inetmgr.exe in %WINDIR%\System32\inetsvr\ (use Environment.GetFolderPath(Environment.SpecialFolder.System) ) to get the %WINDIR%\System32 directory), or using System.DirectoryServices classes using the iis:// scheme (IIRC, if IIS isn't installed trying to use the IIS directory protocol should fail).
WMI (via System.Management ) should also give you information, although I don't remember what WMI classes you want to use off-hand.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Heath Stewart wrote:
There are many ways of determining if IIS is installed, from checking for the inetmgr.exe in %WINDIR%\System32\inetsvr\ (use Environment.GetFolderPath(Environment.SpecialFolder.System)) to get the %WINDIR%\System32 directory),
Thanks. I'll give these a try.
Heath Stewart wrote:
or using System.DirectoryServices classes using the iis:// scheme (IIRC, if IIS isn't installed trying to use the IIS directory protocol should fail).
I tried this already, and on WinServer 2003 I was able to get webRoot object, event though IIS had not been installed.
private bool DetermineIfIISIsInstalled()<br />
{<br />
try<br />
{<br />
DirectoryEntry deRoot= new DirectoryEntry("IIS://LocalHost/W3SVC/1/Root");<br />
if(deRoot==null)<br />
return false;<br />
}<br />
catch(Exception ex)<br />
{<br />
return false;<br />
}<br />
return true;<br />
}
Thanks
Michał
|
|
|
|
|
Hi!
I have made an application with a panel showing 2d graphics. Now I have found out that the grapichs are inverted, the x axis is pointing in the right direction but y is downwards when it should be upwards on the screen. I can´t really find any good way to invert the axis.
I could just change code doing the drawing, but the panel is accessed from a lot of places and it would take a lot of time. What I would like to do is invert the axix at startup and that all the 2d graphics in the panel is drawn in the right way every time a graphics object is created via panel.CreateGraphics().
Help would be much appreciated!
Regards! / Mikke
|
|
|
|
|
GDI and GDI+ all use an axis with the origin in the upper-left corner. This has always been the case. DirectX and I assume OpenGL (never worked with it) use the lower-left corner unless you transform the point of origin.
The painting code will just have to be changed. You should encapsulate this in a derivative class of the Panel you should make, rather than doing the drawing outside the Panel that is responsible for showing the graphics. Encapsulation is a major feature of OOP.
Microsoft MVP, Visual C#
My Articles
|
|
|
|