DLL Problem
-
Ich habe ein grosses Problem, bezüglich einer von mir in VB6
erstellten DLL. Dabei handelt es sich um eine Klasse, mit der man
den MX-Eintrag eines Mail-Servers erfragen kann. Sie
funktioniert auch einwandfrei. (Habe die DLL in VB6 und VB.NET ausprobiert)
Es ist aber unbedingt erforderlich, das diese DLL von VC++6 aus angesprochen
werden kann. Nach tagelanger Suche in diversen Foren und der MSDN, konnte
ich nur rausfinden, wie man mit VC++ DLLs erstellt und einbindet, oder
mit VC++ geschriebene in VB6 nutzt. Ich wäre sehr dankbar,
wenn mir jemand eine einfache Schritt für Schritt Anleitung
geben könnte wie ich diese VB6-DLL in VC++6 zum laufen
bringe, oder wie ich den VB6-Code nach C++ portieren
kann. Dabei ginge es mir eigentlich nur um die API-Deklaration,
wozu ich leider auch keine brauchbaren Infos finden konnte. Die
windows.h ist eingebunden. Der Compiler behauptet aber schon bei der ersten
Funktion 'DnsQuery_A' das er sie nicht finden kann. Laut einer Beschreibung
die ich irgendwo gefunden habe, sollte es aber schon alleine durch das
Einbinden von windows.h funktionieren. (Hab es erfolgreich mit 'GetComputerName'
ausprobiert) Leider konnte ich die beiden Konstanten innerhalb der Klasse auch nicht deklarieren. (Compilerfehler)
Wie man allgemein Klassen in C++ erstellt und verwendet ist mir klar.
Wäre wirklich sehr dankbar wenn mir jemand weiterhelfen könnte,
weis sonst nicht mehr weiter.Hier die VB6-Klasse:
Option Explicit
Private Declare Function DnsQuery Lib "Dnsapi.dll" Alias "DnsQuery_A" ( _
ByVal Name As String, ByVal wType As Integer, ByVal Options As Long, _
aipServers As Any, ppQueryResultsSet As Long, ByVal pReserved As Long) As LongPrivate Declare Sub CopyMem Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
pTo As Any, uFrom As Any, ByVal lSize As Long)Private Declare Function StrLenA Lib "kernel32.dll" Alias "lstrlenA" ( _
ByVal PTR As Long) As LongPrivate Declare Function StrCopyA Lib "kernel32.dll" Alias "lstrcpyA" ( _
ByVal retval As String, ByVal PTR As Long) As LongPrivate Declare Function DnsRecordListFree Lib "Dnsapi.dll" ( _
ByVal pDnsRecord As Long, ByVal DnsFreeRecordListDeep As Long) As LongPrivate Type DNS_SOA_DATA
pNamePrimaryServer As String
pNameAdministrator As String
dwSerialNo As Long
dwRefresh As Long
dwRetry As Long
dwExpire As Long
dwDefaultTtl As Long
End TypePrivate Type DNS_TEXT_DATA
DNSText As String
End TypePrivate Type DNS_MX_DATA
pNameExchange As String
End TypePrivate Type DNS_NS_DATA
pNameServer As String
End TypePrivate Type DNS_PTR_DATA
pHostName As String
End TypePrivate Type VBDnsRecord
pNext As Long
pName As Long
wType As Integer
wDataLength As Integer
Flags As Long
dwTTL As Long
dwReserved As Long
prt As Long
others(9) As Long
End TypePrivate Type DNSRecord
Name As String
Type As Integer
RR As String
Flags As Long
SOA As DNS_SOA_DATA
TEXT As DNS_TEXT_DATA
mx As DNS_MX_DATA
NS As DNS_NS_DATA
PTR As DNS_PTR_DATA
End TypePrivate Type MXQuery
mx As String
success As Boolean
End Type
Private QueryResult As MXQueryPrivate Const DNS_TYPE_MX As Long = &HF
Private Const DnsFreeRecordListDeep As Long = 1&Public Function MXLookup(URL As String)
Dim DNSRec As Long
Dim MyRecord As VBDnsRecord
Dim Records As DNSRecord
Dim x As Longx = DnsQuery(URL, DNS_TYPE_MX, 0, ByVal 0, DNSRec, 0)
If x = 0 Then
CopyMem MyRecord, ByVal DNSRec, 64x = MyRecord.prt
Records.mx.pNameExchange = String$(StrLenA(x), 0)
StrCopyA Records.mx.pNameExchange, xDnsRecordListFree DNSRec, DnsFreeRecordListDeep
QueryResult.mx = Records.mx.pNameExchange
QueryResult.success = True
Else
QueryResult.mx = ""
QueryResult.success = False
End IfEnd Function
Public Property Get mx() As String
mx = QueryResult.mx
End PropertyPublic Property Get success() As Boolean
success = QueryResult.success
End Property
-
Hallo,
ich habe dasselbe Problem und habe folgendes rausgefunden:
Mit Klassen-Assistent kann man aus einer DLL die *.cpp und *.h generieren.
(Rechte Maustaste, Class-Wizard, Add Class, From a type library)Doch dann taucht das nächste Problem auf. Die generierten Daten sind MFC abhängig, verlangen nach "afxdisp.h" und melden bei "windows.h" ein Fehler.
Kennt vielleicht jemand die Lösung?
Danke