Hallo,
Ich habe eine alte, in C geschriebene COM DLL, die ich von meiner ASP.NET Webapplikation aus aufrufen muss.
Mein erster Versuch war folgender:
- DLL mit regsvr32 registrieren
- Bei Visual Studio.NET über ADD Reference einbinden (Visual Studio kümmert sich angeblich automatisch um den ganze Managed<->unmanaged Kram)
- Funktionen aus der DLL aufrufen
Ist irgendwie zu einfach, um funktionieren zu können, nicht? ;)
Ich konnte es problemlos kompilieren, es lief "exeptionfrei" durch, gab aber immer null zurück und machte schlicht nicht das was es sollte (nämlich gar nichts).
In einem zweiten Versuch machte ich es dann so wie hier beschrieben:
http://www.aspheute.com/english/20000828.asp
Das Resultat war genau das gleiche wie bei Versuch 1.
Wird die DLL auf dem selben Computer und mit den selben Parametern von einem VB-Script aufgerufen, so funktioniert es.
Any Ideas?
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Wie hast Du die Funktionen aus der DLL aufgerufen?
Versuch es mal mit
using System.Runtime.InteropServices;
und nicht vergessen:
[DllImport("hier_deine.dll")]
public static extern hier_die_Deklaration_der_zu_verwendenden_Funktion
So (es ist genau genommen nur eine Funktion):
ChangeDcePwAdminClass DceObject = new ChangeDcePwAdminClass();
DceObject.ChangeDcePwAdminBSTR(m_strConnectionString, m_strUser, m_strPW, m_strUserToChange, strNewPW);
string ret = DceObject.ChangeDcePwAdminStatusBSTR;
und nicht vergessen:
[DllImport("hier_deine.dll")]
public static extern hier_die_Deklaration_der_zu_verwendenden_Funktion
Soviel ich weiss, muss man das bei COM nicht so machen, sondern nur bei "normalen" unmanaged dll's. Oder liege ich da falsch?
Wie gesagt, Kompilieren und Ausführen ging einwandfrei, bis auf die Tatsache eben, dass das Passwort nicht wie erwünscht zurückgesetzt wird.
Ups, ja Du hast recht. Sorry auf Anhieb fällt mir da auch nichts mehr ein.
Hallo,
Ist die DLL ein einfaches COM-Object oder Active-X ?
Gruß
PP
http://www.microsoft.com/germany/msdn/library/components/ActiveXUndCOMKomponenten.mspx?mfr=true
So, Problem gelöst.
Ich habe heute den ganzen Tag an dem Ding rumgebastelt. Zuerst hatte die Idee, noch eine reine C-Dll dazwischen zu schalten, die ich dann vom managed Code aus aufrufen kann. Da ich vorher noch nie aus reinem C eine COM DLL verwendet hatte, brauchte ich ziemlich lange, bis es schliesslich lief.
Seltsamerweise hatte ich dort genau das gleiche Problem, wie bei meinen vorigen Versuchen, und konnte wieder von vorne anfangen. Glücklicherweise erhielt ich dann doch noch den Code für das Teufelsding.
Darauf habe ich gleich all den COM-Mist gelöscht und eine reine C-DLL erstellt, die die benötigte Funktion exportiert. Die rufe ich jetzt so aus der managed-Umgebung auf, wie von xafford beschrieben.
... und das klappt ENDLICH :)
Naja du hast das Problem erfolgreich umgangen ja :)
Gelöst wär natürlich schöner gewesen, hätte mich auch interessiert.
Ja, mich hätte es auch interessiert. Aber meiner Meinung nach ist es so sogar besser als mit COM, von daher kann ich es verkraften. (COM kam meines Wissens sowieso nur zum Einsatz, weil das alte Frontend eine ASP Seite war und das der DLL zugrunde liegende API für C ist.)
Knacknüsse gibt es bei diesem Projekt noch genug, langweilig wird mir also auch nicht so schnell. ;)