I can't post the code because I'm not at liberty to distribute the ActiveX controls I used to test it but I can (and have below) post the gist of it.
Now I do have to put a disclaimer in before anyone starts in on me, this is NOT a Silverlight hack and could very easily be ported into any other webpage using simple JavaScript, not only that but it isn't necessarily a bad thing.
Remember the key is the access to HTML DOM which is the exposure point.
Also, remember that the ActiveX control has to be made available to the DOM to be accessable... so the user must download it and install it which, by the way, is ABSOLUTLY not possible to do through Silverlight.
So on with the code...
The first step, obviously, would be to have a Silverlight app open in VS.
Go to your html host page ([MyApp]TestPage.aspx or the like) and add an object reference to the html source:
<object id="MyCoolActiveX" classid="CLSID:123E1234-12AB-123A-AB1D-12341234ABCD"></object>
Got that setup? Okay, now we need to get a reference to that object in Silverlight.
HtmlDocument doc = HtmlPage.Document;
HtmlElement MyCoolActiveX = doc.GetElementById("MyCoolActiveX");
Hmm... that wasn't hard, but how do I call into the control when all I have is an HtmlElement?
object result = MyCoolActiveX.Invoke("DoSomething");
return (string)result;
In my case the expected result is a string so I do a cast before returning the value.
Not too difficult huh? I have a cool little ActiveX control that lets me get a list of all the system processes and it's working great.