Benutzer mit den meisten Antworten
Problem mit Windows 7 und IClassFactory2

Frage
-
Hallo,
ich habe ein Programm geschrieben in dem ich eine Instanz eines anderen Programmes aufrufe (mithilfe der IClassFactory2). Unter Windows XP funktionierte auch alles super jedoch unter Windows 7 kommt ein Fehler (0x80040023)
Fehlercode:
- TAPI_E_NOTOWNER
- ((HRESULT)0x80040023L)
The application does not have OWNER privilege on the call.
Dabei mache ich überhauptnichts mit TAPI.
Hier mal mein Code.
Schnittstelle:
[ //IClassFactory2 GUID Guid("B196B28F-BAB4-101A-B69C-00AA00341D07"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown) ] interface IClassFactory2 { [return: MarshalAs(UnmanagedType.IUnknown)] object CreateInstance([MarshalAs(UnmanagedType.IUnknown)] object outer, [MarshalAs(UnmanagedType.LPStruct)] Guid iid); void LockServer(bool l); object GetLicInfo(); string RequestLicKey(UIntPtr dwReserved); [return: MarshalAs(UnmanagedType.IUnknown)] object CreateInstanceLic([MarshalAs(UnmanagedType.IUnknown)] object outer, [MarshalAs(UnmanagedType.IUnknown)] object reserved, [MarshalAs(UnmanagedType.LPStruct)] Guid iid, string key); }
Prog:
//........... clsid = CLSIDFromProgID("LonWorksObjectServer"); ////MessageBox.Show(IID_IUnknown.ToString()); classFactory = (Com.IClassFactory2)Marshal.BindToMoniker(string.Format("clsid:{0}", clsid)); try { lcaObjectServer = (LcaObjectServer)classFactory.CreateInstanceLic(null, null, IID_IUnknown, "key"); } catch (Exception ex) { MessageBox.Show(ex.Message); }
..... wobei nur der try-catch-Block wichtig ist, die anderen Sachen wurden schon getestet und stimmten auch soweit. In "key" steht der lizensierte Schlüssel und sollte auch der gleiche sein wie für XP.
Gibt es unter Windows7 Probleme mit dieser Art des Instanzaufrufes oder IID_IUnknown?
Ich stehe absolut auf dem Schlauch und habe auch nicht die Ahnung vom IClassFactory2.
- Verschoben Robert BreitenhoferModerator Dienstag, 12. April 2011 15:01 C# (aus:.NET Framework)
Antworten
-
Hallo,
ich habe das Problem gelöst. Es lag an der Datenausführungsverhinderung (DEP). Dort wird beim Linken des Programmes das NXCOMPAT auf YES gesetzt. Dies muss nach dem Erstellen wieder rückgängig gemacht werden.
Mithilfe dieses Konsolenbefehls sollte es wieder gehen:
editbin /NXCOMPAT:NO "ZielPfad" //Zielpfad ist der Pfad zur erstellten EXE
- Als Antwort markiert cap77 Mittwoch, 13. April 2011 11:29
Alle Antworten
-
Hallo cap77,
Schau Dir die folgende Diskussion an. Vielleicht findest Du etwas dass Dir weiter helfen kann.
How to realize IClassFactory2 interface? (Vergleiche mal Dein Code mit diesem)
Schau Dir mal die folgenden Links an. Vielleicht können sie Dir weiter helfen.
To dynamically create a licensed control in C# you need to supply a license string.
http://www.koders.com/csharp/fidD874B0F2DF7BDA4339DEC673A42085DCF67C621C.aspx (hier sehe ich folgendes:
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("B196B28F-BAB4-101A-B69C-00AA00341D07")] public interface IClassFactory2 { void CreateInstance([In, MarshalAs(UnmanagedType.Interface)] object unused, [In] ref Guid refiid, [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppunk); void LockServer(int fLock); void GetLicInfo([Out] NativeMethods.tagLICINFO licInfo); void RequestLicKey([In, MarshalAs(UnmanagedType.U4)] int dwReserved, [Out, MarshalAs(UnmanagedType.LPArray)] string[] pBstrKey); void CreateInstanceLic([In, MarshalAs(UnmanagedType.Interface)] object pUnkOuter, [In, MarshalAs(UnmanagedType.Interface)] object pUnkReserved, [In] ref Guid riid, [In, MarshalAs(UnmanagedType.BStr)] string bstrKey, [MarshalAs(UnmanagedType.Interface)] out object ppVal); }
)
Grüße,
Robert
-
Hallo,
ich habe das Problem gelöst. Es lag an der Datenausführungsverhinderung (DEP). Dort wird beim Linken des Programmes das NXCOMPAT auf YES gesetzt. Dies muss nach dem Erstellen wieder rückgängig gemacht werden.
Mithilfe dieses Konsolenbefehls sollte es wieder gehen:
editbin /NXCOMPAT:NO "ZielPfad" //Zielpfad ist der Pfad zur erstellten EXE
- Als Antwort markiert cap77 Mittwoch, 13. April 2011 11:29