COM DLL's auf bestimte Methode prüfen

andralin

Erfahrenes Mitglied
Hallo Leute,

ich muss in rekursiven Verzeichnis-Analysen die dort gefundenen DLL's und OCX's darauf prüfen ob Sie zu registrieren sind.

Bei .NET nur die wo COM Visible sind. Das ist recht einfach mit:
Code:
static private bool tryToRegisterNet(string file)
        {
            try
            {
                Assembly asm = Assembly.LoadFile(file);
                object[] attribs = asm.GetCustomAttributes(typeof(ComVisibleAttribute), false);

                foreach (object o in attribs)
                {
                    ComVisibleAttribute comAtt = o as ComVisibleAttribute;

                    if (comAtt != null)
                    {
                        if (comAtt.Value)
                        {                            
                            finishRegistration(file, NetType);
                            NETctr++;                            
                            return true;
                        }
                    }
                }
                return false;
            }
            catch
            {
                return false;
            }
        }

Aber nun muss ich eine ähnliche Funktionaliät für COM DLL's und OCX's bauen und verzweifel daran. Ich bekomm einfach nicht heraus ob die DLL die entsprechende Methode zum Registrieren hat. Wer hat für mich ein Beispiel das mir den Weg zeigt.

LG Andralin
 
Hi.

Eine registrierbare DLL hat bestimmte Eintrittspunkte (siehe http://msdn.microsoft.com/en-us/library/ms692604(VS.85).aspx). Du könntest die DLL mit LoadLibrary laden und mit GetProcAddress (http://www.pinvoke.net/default.aspx/kernel32/GetProcAddress.html) überprüfen ob diese Eintrittspunkte vorhanden sind.


Gruß


Erst mal Danke für die Antwort. Soweit ist das auch plausible was in beiden Beispielen zu finden ist. Aber irgendwie bekommm ich das nicht ans Laufen.

So hätt ich das gerne aufgebaut:
Code:
internal static class UnsafeNativeMethods
        {
            [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
            internal static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
        }

        internal delegate int DllRegisterServerInvoker();

        static private bool isComRegisterComponent(string file)
        {
            try
            {                
                IntPtr fptr = UnsafeNativeMethods.GetProcAddress(hModule, "DllRegisterServer");
                if (fptr != new IntPtr())
                {                    
                    DllRegisterServerInvoker drs = (DllRegisterServerInvoker)Marshal.GetDelegateForFunctionPointer(fptr, typeof(DllRegisterServerInvoker));
                    drs(); // call via a function pointer
                    return true;
                }
                return false;
            }
            catch
            {
                return false;
            }
        }

natürlich kennt der nun den Übergabewert hModule nicht. Wenn ich das Beispiel anschaue, dann steht da ein C++ code um hModule zu definieren, aber den will mein CLI einfach nicht *lächel*... Also... irgendwie funktioniert es, da ich ja bei NULL Werten ( fptr != new IntPtr() ) gar nicht erst weiter durch die Methode laufe. letztendlich wird keine DLL geladen, weil ich keine angebe. Wo muss die geladen werden und wie?

LG Andralin
 
natürlich kennt der nun den Übergabewert hModule nicht. Wenn ich das Beispiel anschaue, dann steht da ein C++ code um hModule zu definieren, aber den will mein CLI einfach nicht *lächel*... Also... irgendwie funktioniert es, da ich ja bei NULL Werten ( fptr != new IntPtr() ) gar nicht erst weiter durch die Methode laufe. letztendlich wird keine DLL geladen, weil ich keine angebe. Wo muss die geladen werden und wie?
Wie gesagt mußt du erstmal mit LoadLibrary (oder LoadLibraryEx) die DLL laden. Dadurch bekommst du dann den Wert für hModule den du dann mit der GetProcAddress verwenden kannst.

Siehe http://www.pinvoke.net/default.aspx/kernel32/LoadLibrary.html

Gruß
 
Wie gesagt mußt du erstmal mit LoadLibrary (oder LoadLibraryEx) die DLL laden. Dadurch bekommst du dann den Wert für hModule den du dann mit der GetProcAddress verwenden kannst.

Siehe http://www.pinvoke.net/default.aspx/kernel32/LoadLibrary.html

Gruß
mittlerweile hab ich es dann lösen können und teste es gerade durch.
Mal sehen wie es sich beim rekursiven Test einer Struktur beweisen kann wenn da über 2000 Dateien drin sind. Allerdings hatte ich schon Probleme das einige DLL's über LoadLibrary im Nirwana enden. Kann man dem noch einen timeout mit übergeben? Weist das zufällig?
 
mittlerweile hab ich es dann lösen können und teste es gerade durch.
Mal sehen wie es sich beim rekursiven Test einer Struktur beweisen kann wenn da über 2000 Dateien drin sind.
Wenn du die Bibliothek nicht mehr benötigst solltest du sie natürlich freigeben.
Allerdings hatte ich schon Probleme das einige DLL's über LoadLibrary im Nirwana enden. Kann man dem noch einen timeout mit übergeben? Weist das zufällig?
Was meinst du mit Nirvana? Bei der LoadLibraryEx Funktion kann man einige Flags mitgeben.

Gruß
 
Wenn du die Bibliothek nicht mehr benötigst solltest du sie natürlich freigeben.

Was meinst du mit Nirvana? Bei der LoadLibraryEx Funktion kann man einige Flags mitgeben.

Gruß

Mittlerweile hat scih herausgestellt das drei der DLL's mein Programm abschiessen wenn ich Sie einlese. Warum das muss ich noch prüfen. Aber so wie es ausschaut läuft das einlesen der Bibliothek scheinbar sehr lange und irgendwann reagiert mein y nimmermehr. Mal schauen. Aber auf jedenfall bin ich schon mal weiter. Das letzte Problemchen kann ich notfalls umgehen. Was aber nicht sauber wäre.

Nun habe ich einen Stand das ich aufgrund einer Datei prüfen kann ob
NET Library die für COM registriert werden kann.
COM Library die registriert werden kann.
Damit kann ich die entsprechende Registrierung über die NET Klasse oder die COM Api vornehmen und hoffe das ich am Ende saubere Stände erzeugen kann.

Aber in der nächsten Woche werde ich da sicher noch mit zu kämpfen haben .
 
Zurück