Im Allgemeinen gibt es drei Möglichkeiten, zwischen VB und VC zu programmieren: Eine besteht darin, eine DLL in VC zu generieren und die DLL in VB aufzurufen. Die andere besteht darin, ein ActiveX-Steuerelement (.ocx) in VC zu generieren und es in VB einzufügen Die andere besteht darin, eine DLL in VC zu erstellen, einen ActiveX-Automatisierungsserver in VB zu generieren und ihn in VB aufzurufen. Relativ gesehen stellt die erste Methode die geringsten Anforderungen an VC-Programmierer, erfordert jedoch die Zusammenarbeit Ihrer Partner. Ich empfehle diese Methode.
Lassen Sie uns zunächst über die VC++-Programmierung sprechen. Generieren Sie zunächst das Win32-DLL-Projekt in VC++. Fügen Sie diesem Projekt mehrere Funktionen hinzu, die VB-Benutzer aufrufen können. Damit eine Funktion in einer DLL von VB aufgerufen werden kann, muss sie zwei Bedingungen erfüllen: Zum einen muss die aufrufende Methode stdcall lauten und zum anderen muss sie exportiert werden. Für den ersten Schritt fügen Sie einfach das Schlüsselwort __stdcall vor der Funktionsdeklaration hinzu. wie:
kurzes __stdcall-Beispiel (kurzes nLen, kurzer *Puffer)
Für den zweiten Schritt müssen Sie der *.def-Datei die folgenden Zeilen hinzufügen:
EXPORTE
Probe @1
Das Beispiel hier ist der Name der Funktion, die Sie in VB aufrufen möchten, @1 stellt die Nummer der Funktion in der DLL dar und jede Funktion ist anders. Beachten Sie, dass bei den Funktionsnamen hier die Groß-/Kleinschreibung beachtet wird. Wenn Sie eine große Datenmenge übertragen müssen, können Sie dies tun, indem Sie ein Array verwenden, um die Daten in VB zu speichern, und dann die Größe und Adresse des Arrays an VC übergeben (was die Programmierung in VB betrifft, werde ich tun). stellen Sie es unten vor). Genau wie im obigen Beispiel ist nLen die Array-Größe und buffer die Array-Adresse. Mit diesen beiden Elementen können Sie es wie ein VC-Array verarbeiten. Für die Ausgabegrafiken können Sie das WMF- oder BMP-Format generieren und von VB aufrufen lassen. Ich denke jedoch, dass es auch direkt in das Fenster ausgegeben werden kann, solange VB die Fensterhandles hWnd und hDC und die Zeichenposition des Fensters (die von VB und VC verwendeten Koordinatensysteme müssen konsistent sein) an VC übergibt. Die AutoRedraw-Eigenschaft von VB muss False sein und das VC-Zeichenprogramm wird im Paint-Ereignis aufgerufen.
Lassen Sie uns noch einmal über die VB-Programmierung sprechen. Die Methode zum Aufrufen von DLL durch VB ist dieselbe wie die Methode zum Aufrufen der Windows-API, die im Allgemeinen in VB-Büchern vorgestellt wird. Deklarieren Sie für das obige Beispiel zunächst die VC-Funktion:
Deklarieren Sie die Funktionsbeispielbibliothek „mydll.dll“ (ByVal nLen As Integer, buffer As Integer) als Integer
Hier ist mydll.dll der Name Ihrer DLL. Möglicherweise ist Ihnen aufgefallen, dass die beiden Parameter unterschiedlich deklariert sind und ByVal zum ersten Parameter hinzugefügt wird. Die Regel lautet: Wenn ein Parameter in VC als Zeiger oder Array deklariert ist, wird ByVal nicht hinzugefügt, andernfalls wird ByVal hinzugefügt. Der Aufruf dieser Funktion in VB verwendet die folgende Syntax:
Probe 10, a(0)
Das a()-Array wird hier zum Speichern von Daten verwendet, und 10 ist die Array-Länge. Der zweite Parameter kann hier nicht a() sein, sondern muss der erste der zu übergebenden Daten sein. Dies ist der Schlüssel zur VB-Programmierung.
Nachfolgend sind einige mögliche Probleme aufgeführt, auf die Sie stoßen können. Ein Problem besteht darin, dass VB möglicherweise meldet, dass die DLL nicht gefunden werden kann. Sie können die DLL im Systemverzeichnis ablegen und sicherstellen, dass die Declare-Anweisung von VB korrekt ist. Ein weiteres Problem besteht darin, dass VB meldet, dass es die erforderliche Funktion nicht finden kann. Dies liegt normalerweise daran, dass die *.def-Datei in VC nicht festgelegt ist. Die dritte Situation besteht darin, dass VB Ihnen mitteilt, dass die Konvertierung nicht durchgeführt werden kann. Dies liegt möglicherweise daran, dass das Schlüsselwort __stdcall in VC nicht hinzugefügt wurde, oder dass die Parametertypen von VB und VC inkonsistent sind. Beachten Sie, dass int in VC 4 ist Bytes (entspricht VB Long), während VBs Integer nur 2 Bytes beträgt. Es muss darauf geachtet werden, dass die Anzahl der Parameter in VB und VC gleich ist und auch die Anzahl der von ihnen belegten Bytes gleich ist. Das Letzte, worauf Sie achten müssen, ist, dass das Array die Grenzen in VC nicht überschreiten darf, da es sonst zum Absturz des VB-Programms kommt.
1. Vorteile des DLL-Aufrufs
Als Grundlage des Windows-Betriebssystems bietet die Dynamic Link Library (DLL) eine überlegene Anwendungsleistung:
DLLs erweitern die Funktionen einer Anwendung. Da eine DLL dynamisch in den Adressraum eines Prozesses geladen wird, kann eine Anwendung zur Laufzeit ermitteln, welche Vorgänge ausgeführt werden müssen, und dann den entsprechenden Code laden, um diese Vorgänge nach Bedarf auszuführen.
DLLs können in verschiedenen Sprachen geschrieben werden. Beispielsweise wird VB zum Schreiben der Schnittstelle des Anwendungsprogramms verwendet, und C++ wird zum Schreiben zugrunde liegender Operationen wie Algorithmen und Kommunikation verwendet.
DLLs vereinfachen die Verwaltung von Softwareprojekten. Wenn bei der Softwareentwicklung verschiedene Arbeitsgruppen an unterschiedlichen Modulen arbeiten, ist das Projekt einfacher zu verwalten.
DLL hilft, Speicher zu sparen. Wenn zwei oder mehr Anwendungen dieselbe DLL verwenden, müssen die Seiten der DLL nur einmal in den RAM gestellt werden und alle Anwendungen können ihre einzelnen Seiten gemeinsam nutzen.
DLL erleichtert die gemeinsame Nutzung von Ressourcen. DLLs können Ressourcen wie Dialogvorlagen, Zeichenfolgen, Symbole und Bitmaps enthalten, und mehrere Anwendungen können DLLs verwenden, um diese Ressourcen gemeinsam zu nutzen.
DLL hilft bei der Lokalisierung von Anwendungen. Beispielsweise kann eine Anwendung, die nur Code und keine Benutzeroberflächenkomponenten enthält, eine DLL laden, die lokalisierte Benutzeroberflächenkomponenten enthält.
DLLs helfen bei der Lösung von Plattformunterschieden. Verschiedene Windows-Versionen sind mit unterschiedlichen Funktionen ausgestattet und Entwickler möchten häufig neue Funktionen aufrufen. Wenn der Quellcode jedoch einen Aufruf einer neuen Funktion enthält und die Anwendung auf einer Windows-Version ausgeführt werden soll, die diese Funktion nicht bereitstellt, verweigert der Loader des Betriebssystems die Ausführung des Prozesses. Wenn diese neuen Funktionen in einer DLL gespeichert sind, kann die Anwendung sie in ältere Windows-Versionen laden und die Funktion erfolgreich aufrufen.
2. Suchen Sie den Einstiegspunkt der DLL
Benutzer, die zum ersten Mal mit DLLs in Kontakt kommen, stoßen oft auf ein Problem: Eine in einer VC-Umgebung erstellte DLL läuft in VC einwandfrei, aber beim Aufruf in einer VB-Anwendung erscheint immer der Eintrag „Aufrufkonventionsfehler“ oder „nicht gefunden“. Punkt"-Fehler. Dies ist hauptsächlich auf die folgenden Auslassungen zurückzuführen.
Zunächst ist zu beachten, dass die Funktionsdeklaration in der DLL und die Funktionsdeklaration in VB hinsichtlich Name, Rückgabetyp, Parametertyp, Anzahl der Parameter usw. genau gleich sein müssen. Achten Sie besonders auf die Frage Kapitalisierung.
Zweitens muss die Eingabefunktion zur .def-Datei der DLL hinzugefügt werden.
Schließlich müssen vor der Funktionsdefinition die externen Schlüsselwörter „c“ und _stdcall hinzugefügt werden.
Das konkrete Format entnehmen Sie bitte dem Anwendungsbeispiel.
3. Übergabe von Array-Parametern in der DLL
Da DLL häufig zum Ausführen einiger Vorgänge auf niedriger Ebene verwendet wird, müssen Anwendungen häufig große Datenmengen an die DLL übergeben. In C++ sind Zeiger die beste Wahl für Array-Operationen, in VB gibt es jedoch kein Zeigerkonzept. Dies kann normalerweise auf zwei Arten gelöst werden.
Wenn Sie eine DLL in VB deklarieren, verwenden Sie zunächst byref anstelle von byval, um den Array-Zeiger an die DLL zu übergeben.
Darüber hinaus können Sie das Array direkt an die DLL übergeben, indem Sie das Array als Variante deklarieren.
4. Anwendungsbeispiele
Im Folgenden wird anhand eines konkreten Beispiels der Prozess des Aufrufs einer in einer VC-Umgebung erstellten DLL in VB veranschaulicht.
Erstellen Sie eine DLL zur Signalverarbeitung, „SigPro.dll“, die eine Funktion „Fourier“ für Fourier-Berechnungen enthält.
Aussage in VC:
Fügen Sie den folgenden Code zu „SigPro.h“ hinzu:
Kopieren Sie den Codecode wie folgt:
externes „C“
{
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);
}
Fügen Sie den folgenden Code zu „SigPro.cpp“ hinzu:
externes „C“
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos)
{
int i;
doppeltes Ergebnis=0,0;
if(SinOrCos==true)
{
for(i=0;i<NumSam;i++)
{
result=result+*(Sample+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
anders
{
for(i=0;i<NumSam;i++)
{
result=result+*(Sample+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
result =result*2/NumSam;
Ergebnis zurückgeben;
}
Fügen Sie den folgenden Code zu „SigPro.def“ hinzu:
EXPORTE
Fourier
Call-Anweisung in VB:
Öffentliche Deklaration der Funktion Fourier Lib „SigPro“ (ByRef Sample() As Long, ByVal NumSam As Integer, ByVal OvertoneOrder As Integer, ByVal SinOrCos As Boolean) As Double