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 Long

    Private 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 Long

    Private Declare Function StrCopyA Lib "kernel32.dll" Alias "lstrcpyA" ( _
    ByVal retval As String, ByVal PTR As Long) As Long

    Private Declare Function DnsRecordListFree Lib "Dnsapi.dll" ( _
    ByVal pDnsRecord As Long, ByVal DnsFreeRecordListDeep As Long) As Long

    Private 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 Type

    Private Type DNS_TEXT_DATA
    DNSText As String
    End Type

    Private Type DNS_MX_DATA
    pNameExchange As String
    End Type

    Private Type DNS_NS_DATA
    pNameServer As String
    End Type

    Private Type DNS_PTR_DATA
    pHostName As String
    End Type

    Private 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 Type

    Private 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 Type

    Private Type MXQuery
    mx As String
    success As Boolean
    End Type
    Private QueryResult As MXQuery

    Private 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 Long

    x = DnsQuery(URL, DNS_TYPE_MX, 0, ByVal 0, DNSRec, 0)

    If x = 0 Then
    CopyMem MyRecord, ByVal DNSRec, 64

    x = MyRecord.prt
    Records.mx.pNameExchange = String$(StrLenA(x), 0)
    StrCopyA Records.mx.pNameExchange, x

    DnsRecordListFree DNSRec, DnsFreeRecordListDeep

    QueryResult.mx = Records.mx.pNameExchange
    QueryResult.success = True
    Else
    QueryResult.mx = ""
    QueryResult.success = False
    End If

    End Function

    Public Property Get mx() As String
    mx = QueryResult.mx
    End Property

    Public 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


Log in to reply