MS-Office-Forum

Zurück   MS-Office-Forum > Archive > Microsoft Access - Archiv > Microsoft Access - Archiv (2001)
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 03.10.2001, 18:18   #1
Rallekalle
MOF User
MOF User
Standard DLL-Aufruf aus Access

Hallo zusammen,
ich muss, um in meinem Programm GPS-Daten in Straße und Hausnummer auflösen zu können, aus Access heraus eine DLL aufrufen und drei Parameter übergeben. Die DLL ist mir mit unten stehender Anleitung zugestellt worden. Leider habe ich keine Ahnung wie man das macht. Wenn sich jemand mit so etwas auskennt, wäre ich für eine Hilfestellungsehr dankbar.

Anleitung:
DLL-Schnittstelle exportiert 3 Funktionen

1) int InitDLL( LPCSTR mappath, LPCSTR logfile )

initialisiert die DLL. Der Parameter gibt das Verzeichnis an, in dem sich die Kartendaten befinden. gibt den Namen und Pfad einer Logdatei an, in die die DLL Fehlerausgabe protokolliert. kann NULL sein, wenn keine Ausgabe erwünscht ist. Rückgabewert ist 0, wenn erforderlich, >0 wenn Fehler.

2) int Geo2Text( LONG lat, LONG lon, LONG geo_format, LPSTR params, LPSTR buffer, UNIT bufsize )

Parameter:
ylat>, Längen- und Breitengrad.
bestimmt, in welchem Format und erwartet werden:
1 = Format gggmmss (Grad,Minuten,Sekunden)
2 = Format gggmmssdd (dd=100tel Sekunden)
3 = Format gggmmtttt (tttt=10000tel Minuten)
Parameter - z.B. welche Deutsch/Englisch, Detaillierung usw.
Ausgabepuffer
Größe des Puffers in Bytes.
Rüchgabewert der Geo2Text Funktion ist 0, wenn erfolgreich, >0 wenn Fehler

3) int ExitDLL()

DLL-Resourcen freigeben. Rückgabewert ist 0, wenn erfolgreich, >0 wenn Fehler

Vielen Dank schon mal,
bis dann,
Ralle
Rallekalle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 03.10.2001, 19:16   #2
MarioR
MOF Meister
MOF Meister
Suche

Hallo Ralle,

ich kenn das jetzt zwar nur von API-Funktionen, die ja auch in DLL's stehen, aber es müsste hier genauso funktionieren:

1. Erstelle ein Modul. Dort scheibst Du folgende Zeilen rein:

Code:

Public Declare Function InitDLL Lib "DerNameDeinerDllDatei.dll"_
(mappath As String, logfile As String) As Integer

Public Declare Function Geo2Text Lib "DerNameDeinerDllDatei.dll"_
(lat As Long, lon As Long, geo_format As Long, params As String, buffer As String,_
bufsize As Byte) As Integer

Public Declare Function ExitDLL Lib "DerNameDeinerDllDatei.dll" As Integer
Du musst mal sehen, ob die Parameter so richtig definiert sind.

2. Im Programm rufst Du die Funktionen dann ganz normal auf:

Code:

Dim intErgebnis As Integer
intErgebnis=InitDLL(...)
If intErgebnis>0 Then
  MsgBox "Fehler"
End If

__________________

Mario

Fluchen ist die einzige Sprache, die alle Programmierer perfekt beherrschen.
MarioR ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 03.10.2001, 23:17   #3
Sascha Trowitzsch
MOF Guru
MOF Guru
Standard

Mario,

ich bin mir da nicht so sicher mit deinen Typen...

Ich würde sagen:
LONG = Long
LPSTR = String
INT = Long (bei Rückgabe)
UINT (nicht, wie angegeben UNIT!) = Integer; vielleicht geht auch Long

Mit LPCSTR kann es Schwierigkeiten geben. Vielleicht geht String nicht.
Möglicherweise muss VarPtr(String) angegeben werden. Es kommt dann noch drauf an, ob selbiger String (=Verzeichnisname) ANSI oder Unicode ist.

Tja, Rallekalle, die Anleitung ist leider etwas dürftig.
Und VB ist leider beschissen, wenn es um die Übergabe von Strings geht. Da muss etwas experimentiert werden.

Ciao, Sascha

__________________

Microsoft Access MVP
O2k bis O2010, VB6, VS2008, Delphi7, ...
Bitte keine ungefragten E-Mails. Probleme werden hier gelöst.
Bitte beachten: Grundlegendes zum Access-Forum

Knowhow auf Access-im-Unternehmen | Das Access 2007 Praxisbuch für Entwickler | www.mossTOOLs.de
Sascha Trowitzsch ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.10.2001, 08:12   #4
Rallekalle
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo und Danke schon mal für die Unterstützung. Ich werde heute ein paar Versuche unternehmen und melde mich wieder, wenn ich erfolgreich war oder nicht.
Bis dann
Ralle
Rallekalle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.10.2001, 13:21   #5
Rallekalle
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo nochmal.

Klappt leider nicht, es erscheint beim Aufruf die Meldung
"Fehler beim Kompilieren: Benutzerdifinierter Typ nicht definiert".

Habt Ihr noch ne Idee? Der Programmierer der DLL kann leider kein VBA und kann mir deshalb nicht helfen.

Bis dann,
Ralle
Rallekalle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.10.2001, 14:00   #6
Sascha Trowitzsch
MOF Guru
MOF Guru
Standard

Na wie sehen denn jetzt deine Deklarationszeilen aus?

Mit der DLL selbst hat die Fehlermeldung bis jetzt noch nicht zu tun, sondern mit einem Fehler in einer der drei Deklarationen.

Ciao, Sascha

__________________

Microsoft Access MVP
O2k bis O2010, VB6, VS2008, Delphi7, ...
Bitte keine ungefragten E-Mails. Probleme werden hier gelöst.
Bitte beachten: Grundlegendes zum Access-Forum

Knowhow auf Access-im-Unternehmen | Das Access 2007 Praxisbuch für Entwickler | www.mossTOOLs.de
Sascha Trowitzsch ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.10.2001, 15:02   #7
Rallekalle
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hi Sascha,

habe folgendes gemacht:
neues Modul:
Option Compare Database
Option Explicit

Public Declare Function InitDLL Lib "dfGeo2Text.dll" (mappath As String, logfile As String) As interger
Public Declare Function Geo2Text Lib "dfGeo2Text.dll" (lat As Long, lon As Long, geo_format As Long, params As String, buffer As String, bufsize As Byte) As Integer
Public Declare Function ExitDLL Lib "dfGeo2Text.dll" () As Integer

Aufruf aus Programm:
Private Sub Befehl0_Click()
Dim intErgebnis As Integer
intErgebnis = InitDLL("e:\map\d7.map", "e:\logfile.txt")
If intErgebnis > 0 Then
MsgBox "Fehler"
End If
End Sub

Bis dann,
Ralle
Rallekalle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.10.2001, 15:38   #8
MarioR
MOF Meister
MOF Meister
Standard

Hallo Ralle,

zwei Sachen fallen mir auf:

1. Deklaration InitDLL verkehrt
... As Integer

2. Deklaration ExitDLL brauch, glaub ich, keine Klammern:
... "dfGeo2Text.dll" As Integer

__________________

Mario

Fluchen ist die einzige Sprache, die alle Programmierer perfekt beherrschen.
MarioR ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.10.2001, 18:33   #9
Rallekalle
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hi Mario,

das sieht schon besser jetzt aus. Jetzt bekomme ich als Fehlermeldung "Falsche DLL Aufrufkonvention" (aus ACCESS XP). Ich denke, das liegt an diesen LPCSTR, ich weiß nicht so recht, was der Mensch darunter versteht. Aber anscheinend wird die DLL jetzt angesprochen.
Ralle
Rallekalle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.10.2001, 18:38   #10
Sascha Trowitzsch
MOF Guru
MOF Guru
Standard

Doch, Mario, die Klammern sind schon notwendig.
Der Schreibfehler interger ist natürlich in integer zu ändern.

Dann müsste sein VBA-Code jedenfalls erstmal laufen.

Versuch dich erstmal an InitDll, ob String für mappath und logfile geht.
Mir schwant, dass es nicht funzt.

Public Declare Function InitDLL Lib "dfGeo2Text.dll" (mappath As String, logfile As String) As integer

Dann probier den Aufruf:

InitDLL(VarPtr("e:\map\d7.map"),VarPtr("e:\logfile.txt"))

Es kann Abstürze von Access hageln :-)

Ciao, Sascha

PS: LPCSTR heißt long pointer C-String, also ein Pionter auf einen nullterminierten String.

Wie schon erwähnt gibt damit Schwierigkeiten mit VB, weil es diese Pointer und Strings nicht kennt. Die Umwandlung ist leider auch sehr vielfältig. XP benutz Unicode-Strings. Das will die DLL wahrscheinlich nicht. Möglicherweise musst du erst die Path-Strings mit StrConv (siehe Hilfe) in ANSI umwandeln.
Und dann ist immer noch nicht sichergestellt, dass STRING in der Deklaration auch einen Pointer erzeugt. Deshalb die Geschichte mit VarPtr. (Die Funktion ist in VBA nicht dokumentiert; gibt einen Pointer auf eine Variable zurück).

Das ganze Thema wird dich noch viel Zeit kosten.

__________________

Microsoft Access MVP
O2k bis O2010, VB6, VS2008, Delphi7, ...
Bitte keine ungefragten E-Mails. Probleme werden hier gelöst.
Bitte beachten: Grundlegendes zum Access-Forum

Knowhow auf Access-im-Unternehmen | Das Access 2007 Praxisbuch für Entwickler | www.mossTOOLs.de
Sascha Trowitzsch ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.10.2001, 18:46   #11
Rallekalle
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hi Sascha,

Dein Gespür war richtig, die letzte Fehlermeldung bleibt, auch mit InitDLL(VarPtr("e:\map\d7.map"), VarPtr("e:\logfile.txt")).

Unsere Eintragungen haben sich überschnitten. Jetzt verstehe ich die Anforderungen. Im Notfall muß ich den Programmierer dazu bringen, seine DLL zu ändern.

Danke Euch auf jeden Fall schon mal vielmals, das war mir schon eine große Hilfe.
Rallekalle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.10.2001, 19:00   #12
Sascha Trowitzsch
MOF Guru
MOF Guru
Standard

OK versuch das:

Dim PATH as string, MAP as string, i as integer

MAP = "e:\map\d7.map"
PATH = "e:\logfile.txt"

i = InitDLL(StrConv(MAP,vbFromUnicode),StrConv(PATH,vbFromUnicode))

oder

i = InitDLL(VarPtr(StrConv(MAP,vbFromUnicode)),VarPtr(StrConv(PATH,vbFromUnicode)))

... und dann das Ganze noch mit Änderung der Deklaration InitDLL ... AS LONG und Dim i as LONG.

Soweit für heute, Sascha


PS: Wenn der Programmierer das ändern kann, dann soll er aus LPCSTR > LPSTR machen.

__________________

Microsoft Access MVP
O2k bis O2010, VB6, VS2008, Delphi7, ...
Bitte keine ungefragten E-Mails. Probleme werden hier gelöst.
Bitte beachten: Grundlegendes zum Access-Forum

Knowhow auf Access-im-Unternehmen | Das Access 2007 Praxisbuch für Entwickler | www.mossTOOLs.de
Sascha Trowitzsch ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:21 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.