eigenes activex initialisieren
-
hallo,
ich schreibe eine erweiterung für den internet explorer, die daten eines eyetrackers an javascript weiterreicht kann. dafür habe ich ein BHO welches die DLL des eyetrackers lädt und mit dieser kommuniziert. zur kommunikation des BHO mit dem javascript in der seite soll nun ein activex zum einsatz kommen (ich bin diesem tut gefolgt: http://blogs.msdn.com/b/nicd/archive/2007/04/18/calling-into-your-bho-from-a-client-script.aspx). zum testen habe ich eine kleine html seite in welcher das activex aufgerufen werden soll.
das ganze kompiliert und startet auch. allerdings bekomme ich immer die fehlermeldung: 'Fehler: Automatisierungsserver kann Objekt nicht erstellen.'
dieser fehler wird durch dieses stück code verursacht
var myATL = new ActiveXObject("MyIEAddonDLL.MyActiveX");
so weit ich weiß, muss der string zur initialisierung des activexobjects sein: 'Projekt.Klasse' was ich auch genau dort oben benutze. was kann der fehler sein? kann ich irgendwo nachschauen, wie der aufruf bei mir heißen müsste?
vielen dank
-
Ist denn das Objekt registriert?
Hast Du mal in der Registry nachgesehen...
-
also ich habe 3 .rgs dateien, eine für die DLL und jeweils eine für das BHO und das ActiveX, die in der DLL enthalten sind:
DLL:
HKCR { } HKLM { NoRemove SOFTWARE { NoRemove Microsoft { NoRemove Windows { NoRemove CurrentVersion { NoRemove Explorer { NoRemove 'Browser Helper Objects' { ForceRemove '{86DE965F-D7F3-407F-87D3-29B3441D74FD}' = s 'MyIEAddonDLL' { val 'NoExplorer' = d '1' } } } } } } } }
BHO:
HKCR { NoRemove CLSID { ForceRemove {86DE965F-D7F3-407F-87D3-29B3441D74FD} = s 'MyBHO' { ForceRemove Programmable InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } TypeLib = s '{BC4C4FEE-4A9F-4EC1-AC2B-A9D040C1E870}' Version = s '1.0' } } }
\1:
HKCR { NoRemove CLSID { ForceRemove {EFB670B4-2307-416E-82D6-437207114405} = s 'MyActiveX' { ForceRemove Programmable InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } ForceRemove Control ForceRemove 'ToolboxBitmap32' = s '%MODULE%, 107' MiscStatus = s '0' { '1' = s '%OLEMISC%' } TypeLib = s '{BC4C4FEE-4A9F-4EC1-AC2B-A9D040C1E870}' Version = s '1.0' } } }
ich registriere die DLL mit regsvr32, das klappt auch und das BHO wird auch im internet explorer unter add-ons angezeigt. muss ich noch mehr machen?
-
Versuch mal ob du das ActiveX in einem ActiveX Test-Container erzeugen kannst.
-
also, ich habe jetzt als Test-Container das TstCon aus den Samples kompiliert (VS2010). wenn ich dort nun auf Edit->Insert New Control->MyActiveX gehe wird danach ein schwarzes kästchen angezeigt, in welchem ATL 10.00 steht. heißt das, alles ist ok? soll ich evtl. mehr code posten?
sorry, ich habe mit activex noch nie was gemacht
-
Weiss ich nicht, ich hab' ja keine Ahnung wie dein ActiveX Control aussieht. Wenn das "ATL 10.00" ausgibt wird alles gut sein.
Bzw. wenn du dabei keine Fehlermeldung bekommst, ist das schonmal ein gutes Zeichen.
Mach doch einfach mal in die CMyClass::SetSite ein DebugBreak() rein. Dann bekommst du so ein nettes Fenster über das du den Debugger starten kannst, und dann siehst du, ob die Funktion in deinem ActiveX Control auch aufgerufen wurde.
-
Nochwas...
sn0b schrieb:
dieser fehler wird durch dieses stück code verursacht
var myATL = new ActiveXObject("MyIEAddonDLL.MyActiveX");
so weit ich weiß, muss der string zur initialisierung des activexobjects sein: 'Projekt.Klasse' was ich auch genau dort oben benutze.
Der String muss "TypeLibraryName.ClassName" sein. Zumindest kenne ich das nur so.
z.B. "ADODB.Recordset".Dabei muss der Name der Type-Library nicht unbedingt dem Namen der DLL entsprechen.
Wie deine Type-Library heisst weiss ich natürlich nicht.
-
wo/wie kann ich denn den namen der Type-Library definieren bzw. diesen nachsehen?
-
Im IDL File sollte ein "library" Block stehen: http://msdn.microsoft.com/en-us/library/windows/desktop/aa367069.aspx
-
Ja, in dem IDL steht ein library block. Die Library dort heißt 'MyIEAddonDLLLib' und dann gibt es einen Eintrag 'coclass MyActiveX'. Ich denke, somit müsste der String also sein '"MyIEAddonDLLLib.MyActiveX'. Ich habe das so auch ausprobiert, aber der Fehler bleibt. Ich habe auch ein DebugBreak(); in die SetSite der ActiveX-Klasse gemacht, allerdings wird er nicht ausgelöst, SetSite also wohl nicht aufgerufen. Wenn ich aber Breakpoints z.B. auf das SetSite des BHO oder auf die dllmain mache, werden diese beachtet.
-
Komisch...
Ja, das müsste dann "MyIEAddonDLLLib.MyActiveX" sein.
Mach mal ein Testprojekt in der Sprache deiner Wahl, und versuch da drinnen das ActiveX zu erzeugen.
Einfach mal nur erzeugen. Über den gleichen String den du auch im dem Dings-Script (Java-Script?) verwendest das das Ding im Browser erzeugen soll.In C++ müsste das reichen:
#include <comip.h> _COM_SMARTPTR_TYPEDEF(IUnknown, IID_IUnknown); int main() { IUnknownPtr obiWan; HRESULT hr = obiWan.CreateInstance(L"MyIEAddonDLLLib.MyActiveX"); }
Dann lass das mal im Debugger laufen, und guck ob deine DLL überhaupt geladen wird.
Wenn nicht, ist vermutlich irgendwas nicht richtig registriert. Wenn schon, dann stimmt vermutlich irgendwas im Code nicht.Vielleicht stimmen dir .rgs Files nicht?
Ich hab mit .rgs Files noch nie manuell rumgemacht. Ich registriere meine COM DLLs immer über regsvr32, und lass die nötigen Infos von VS selbst erstellen (MIDL oder wer das macht, k.A., funktioniert irgendwie automagisch, mir auch ziemlich egal wie, weil's bisher immer geklappt hat).