Anfängerfrage zu DLL
Moderator: Moderatoren
Anfängerfrage zu DLL
Hallo Forenmitglieder,
bei einigen Projekten habe ich bereits DLL Dateien mit Erfolg vewendet.
Jedoch hänge ich im Moment an einer einfachen Stelle. Und zwar will ich eine DLL-Datei mit DllLoad("ADSDLL.DLL") laden.
DllLoad gibt 0 zurück und die DOSERROR ==> Das angegebene Modul wurde nicht gefunden.
Diese Dll-Datei ist im Verzeichnis c:\windows\system32 vorhanden. Außerdem habe ich diese DLL bereits zusätzlich in mein Programmverzeichnis kopiert.
Was kann die Fehlerursache sein ?
Muss die DLL Datei unter Windows XP registriert sein ?
mfg
mkersch
bei einigen Projekten habe ich bereits DLL Dateien mit Erfolg vewendet.
Jedoch hänge ich im Moment an einer einfachen Stelle. Und zwar will ich eine DLL-Datei mit DllLoad("ADSDLL.DLL") laden.
DllLoad gibt 0 zurück und die DOSERROR ==> Das angegebene Modul wurde nicht gefunden.
Diese Dll-Datei ist im Verzeichnis c:\windows\system32 vorhanden. Außerdem habe ich diese DLL bereits zusätzlich in mein Programmverzeichnis kopiert.
Was kann die Fehlerursache sein ?
Muss die DLL Datei unter Windows XP registriert sein ?
mfg
mkersch
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1931
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Anfängerfrage zu DLL
Meines Wissens muß sich die DLL-Datei im gleichen Verzeichnis befinden, wie die entsprechende EXE-Datei. Mach doch vorher eine If File() - Abfrage.
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Anfängerfrage zu DLL
Hi,
laut Handbuch und Erfahrungen ...
Tippfehler ?
Zugriffsrechte ?
Kopiere die DLL mal ins Programmverzeichnis, wenn es dann geht, fehlen dir Zugriffsrechte.
... das hast du ja schon gemacht ...
laut Handbuch und Erfahrungen ...
ist c:\windows\system32 im Prinzip OK.Win32 - Unter Windows erfolgt die Suche in der Reihenfolge aktuelles Verzeichnis,
Windows System Verzeichnis, Windows Verzeichnis und am Schluß alle Verzeichnisse,
die in der Umgebungsvariable PATH definiert sind.
Tippfehler ?
Zugriffsrechte ?
Kopiere die DLL mal ins Programmverzeichnis, wenn es dann geht, fehlen dir Zugriffsrechte.
... das hast du ja schon gemacht ...
Gruß
Hubert
Hubert
Re: Anfängerfrage zu DLL
if file("adsdll.dll") bringt true (da ja im aktuellen Verzeichnis)
DllLoad("adsdll.dll") ==> Rückgabe = 0 ==> DOSERROR 126 ==> Das angegebene Modul wurde nicht gefunden
mfg
mkersch
DllLoad("adsdll.dll") ==> Rückgabe = 0 ==> DOSERROR 126 ==> Das angegebene Modul wurde nicht gefunden
mfg
mkersch
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Anfängerfrage zu DLL
Hallo,
schreibe doch mal den Namen absichtlich falsch (also dass die DLL nicht vorhanden ist)
und prüfe welche Fehlermeldung dann erscheint. Ich hätte nämlich eine kleinere Nummer (Datei nicht gefunden) erwartet.
Kann es sein, dass die DLL selbst z.B. einen Dongle benötigt um geladen zu werden ?
Kannst du es mit einer anderen Sprache probieren ob die DLL geladen wird ?
schreibe doch mal den Namen absichtlich falsch (also dass die DLL nicht vorhanden ist)
und prüfe welche Fehlermeldung dann erscheint. Ich hätte nämlich eine kleinere Nummer (Datei nicht gefunden) erwartet.
Kann es sein, dass die DLL selbst z.B. einen Dongle benötigt um geladen zu werden ?
Kannst du es mit einer anderen Sprache probieren ob die DLL geladen wird ?
Gruß
Hubert
Hubert
Re: Anfängerfrage zu DLL
DllLoad("falscherName") bringt auch die Fehler Nr 126
Kann dies evtl mit dem DEBUGER xppdbg zusammenhängen ?
mfg.
mkersch
Kann dies evtl mit dem DEBUGER xppdbg zusammenhängen ?
mfg.
mkersch
- Martin Altmann
- Foren-Administrator
- Beiträge: 16586
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Anfängerfrage zu DLL
Moin,
ich nutze kein ADS.
Aber: Wenn man eine DLL laden will, die eine andere DLL braucht und diese fehlt, dann kann auch die zu ladende DLL nicht geladen werden...
Viele Grüße,
Martin
ich nutze kein ADS.
Aber: Wenn man eine DLL laden will, die eine andere DLL braucht und diese fehlt, dann kann auch die zu ladende DLL nicht geladen werden...
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Anfängerfrage zu DLL
Was soll "ADSDLL.DLL" sein? Die ADSDBE lädt man durch "DBELoad("ADSDBE")".
Es gibt viele Möglichkeiten. Zuweilen laden DLLs selbst weitere - abhängige - DLLs oder sonstige Dateien nach, und wenn die nicht gefunden werden, lässt sich auch das Original nicht laden. So kann es einem z.B. mit List&Label ergehen, wenn man zwar die "CMLL15.DLL" im Blick (Programmverzeichnis, Systemverzeichnis, kompletter Suchpfad) hat, aber nicht die diversen Module, die von dieser DLL wiederum geladen werden sollen.
Ergänzung: Die "ADSDBE.DLL" benötigt die beiden DLLs ACE32.DLL und AXCWS32.DLL (Client-DLLs für die jeweilige ADS-Version). Diese sollten sich also auch im Suchpfad befinden, falls es darum geht.
Es gibt viele Möglichkeiten. Zuweilen laden DLLs selbst weitere - abhängige - DLLs oder sonstige Dateien nach, und wenn die nicht gefunden werden, lässt sich auch das Original nicht laden. So kann es einem z.B. mit List&Label ergehen, wenn man zwar die "CMLL15.DLL" im Blick (Programmverzeichnis, Systemverzeichnis, kompletter Suchpfad) hat, aber nicht die diversen Module, die von dieser DLL wiederum geladen werden sollen.
Ergänzung: Die "ADSDBE.DLL" benötigt die beiden DLLs ACE32.DLL und AXCWS32.DLL (Client-DLLs für die jeweilige ADS-Version). Diese sollten sich also auch im Suchpfad befinden, falls es darum geht.
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Anfängerfrage zu DLL
das habe ich mich vorhin auch gefragtTom hat geschrieben:Was soll "ADSDLL.DLL" sein? Die ADSDBE lädt man durch "DBELoad("ADSDBE")".
mit dem ADS hat es nichts zu tun, es ist eine Schnittstelle für Hardwareansteuerung - soweit ich das verstanden habe:
http://infosys.beckhoff.com/index.php?c ... ro.htm&id=Beckhoff ADS-Welt. ADS steht für "Automation Device Specification" und beschreibt eine Geräte- und Feldbusunabhängige Schnittstelle.
Gruß
Hubert
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16586
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Anfängerfrage zu DLL
Auf der Seite war ich auch gelandet - und dort steht, dass noch eine zweite DLL unbedingt dazu gehört:
Viele Grüße,
Martin
Darum auch mein Hinweis oben.Die ADSDLL.DLL und die TcADSDLL.DLL sind als Bundle zu behandeln und somit immer als Paket zu kopieren.
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Re: Anfängerfrage zu DLL
Vielen Dank für Eure Unterstützung !
Nach Euren Hinweisen, das evtl eine zweite Dll benötigt wird, haben wir folgenden Versuch gemacht.
ADSDLL.DLL ==> In aktuelles Verzeichnis kopiert
TCADSDLL.DL ==> in aktuelles Verzeichnis kopiert
Im Xbaseprogramm ==>
DLLLOAD("TCADSDLL.DLL") ==> Diese DLL wurde fehlerfrei geladen
DLLLOAD(ADSFLL.DLL") ==> Fehler Nr. 126
mfg.
mkersch
Nach Euren Hinweisen, das evtl eine zweite Dll benötigt wird, haben wir folgenden Versuch gemacht.
ADSDLL.DLL ==> In aktuelles Verzeichnis kopiert
TCADSDLL.DL ==> in aktuelles Verzeichnis kopiert
Im Xbaseprogramm ==>
DLLLOAD("TCADSDLL.DLL") ==> Diese DLL wurde fehlerfrei geladen
DLLLOAD(ADSFLL.DLL") ==> Fehler Nr. 126
mfg.
mkersch
Re: Anfängerfrage zu DLL
Diese Programm läuft auf einem PC mit Windows XP und dem bereits installierten Entwicklungssystem von Beckhoff.
Die zuvor beschriebenen Probleme tretten nur auf einem PC auf, auf den nur die Twin Cat Communications API installiert wurde.
Da ja evtl. auf dem Rechner, auf dem das Entwicklungssystem installiert ist, bereits die DLL geladen sind haben wir auf dem Rechner (ohne Entw. System)
die DLLLOAD Befehle für TCADSDLL und ADSDLL hinzugefügt.
mfg.
mkersch
Die zuvor beschriebenen Probleme tretten nur auf einem PC auf, auf den nur die Twin Cat Communications API installiert wurde.
Da ja evtl. auf dem Rechner, auf dem das Entwicklungssystem installiert ist, bereits die DLL geladen sind haben wir auf dem Rechner (ohne Entw. System)
die DLLLOAD Befehle für TCADSDLL und ADSDLL hinzugefügt.
Code: Alles auswählen
#include "ot4xb.ch"
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
DLL AdsDLL IMPORT AdsPortOpen AS INT32
// ---------------------------------------------------------------------------
DLL AdsDLL IMPORT AdsGetLocalAddress AS INT32;
PARAM pAddr AS LPSTR
// ---------------------------------------------------------------------------
DLL AdsDLL IMPORT AdsSyncReadWriteReq AS INT32;
PARAM pAddr AS LPSTR,;
PARAM nIndexGroup AS INT32,;
PARAM nIndexOffset AS INT32,;
PARAM nReadLength AS INT32,;
PARAM pReadData AS LPSTR,;
PARAM nWriteLength AS INT32,;
PARAM pWriteData AS LPSTR
// ---------------------------------------------------------------------------
DLL AdsDLL IMPORT AdsSyncReadReq AS INT32;
PARAM pAddr AS LPSTR,;
PARAM nIndexGroup AS INT32,;
PARAM nIndexOffset AS INT32,;
PARAM nReadLength AS INT32,;
PARAM pReadData AS LPSTR
// ---------------------------------------------------------------------------
DLL AdsDLL IMPORT AdsSyncWriteReq AS INT32;
PARAM pAddr AS LPSTR,;
PARAM nIndexGroup AS INT32,;
PARAM nIndexOffset AS INT32,;
PARAM nWriteLength AS INT32,;
PARAM pWriteData AS LPSTR
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
DLL AdsDLL IMPORT AdsPortClose AS INT32
procedure main
local nErr,nPort
local Addr := space(10)
local ZielVar:= space(200)
local sVar
local AnzLesen
local i,y
local nHandl:= space(4)
local aWerte[100],bWerte[100]
for i:=1 to 100
aWerte[i] := 0
bWerte[i] := 0
next i
nPort = AdsPortOpen()
//nErr = AdsGetLocalAddress(@Addr)
/* Hintergrundinformation zur Kommunikation mit ADS Funktionen:
In unserem Fall wird von einem CP7701 (Touch-Panel) aus einer CX9000 Variableninhalte gelesen.
Um eine Kommunikation zu ermöglichen mussten beide in den gleichen IP-Rahmen gelegt werden
- CP7701 (mit zwei Schnittstellen) ==> 192.168.5.204 (1. Schnittstelle) und 192.168.5.205 (2.Schnittstelle)
==> mittels Netzwerkeinstellungen
- Route hinzugefügt. Im CP 7701 wurde der Name vom CX9000 + AMS + IP hinzugefügt.
==> EXPLORER ==> Harddisk ==> System ==> TcAmsRemoteMgr
Name: CX_053553 AMS 5.5.53.83.1.1 IP 192.168.5.203 (CX Prüfanlage)
- CX9000 (Prüfanlage) ==> IP 192.168.5.203 (mit Hilfe von CERHOST)
==> mittesl Netzwerkeinstellungen
- Route hinzufügen . IM CX9000 wurde der Name vom CP7701 + AMS + IP hinzugefügt.
==> CERHOST ==> EXPLORER ==> Harddisk ==> System ==> TcAmsRemoteMgr
Name: CP_076018 AMS 5.7.96.24.1.1 IP 192.168.5.205 (2. Schnittstelle verwendet)
*/
/* Mit der Funktion AdsSyncReadWriteReq kann aus einer x-beliebigen Steuerung durch Angabe der AMS-Ned-Id und Port_nr
eine Variable bzw. ein Array gelesen werden.
Erkenntnis:
nErr = AdsSyncReadWriteReq(@Addr, 0xF004, 0, AnzLesen, @ZielVar, len(sVar), @sVar)
Will man nur Daten aus Beckhoff lesen, reicht die funktion AdsSyncReadWrite mit Indexgroup F004
d.h. man kann Variableninhalte aus der Steuerung lesen per Angabe des Vriablennamens
Will man Daten in die Beckhoffsteuerung schreiben, und dies auch per Name, erfolgt dies in zwei Schritten
1. nErr = AdsSyncReadWriteReq(@Addr, 0xF003, 0, 4, @nHandl, len(sVar), @sVar)
Handl zu dem Variablennamen aus Steuerung lesen ==> Wichtig Indexgroup F003
2. nErr = AdsSyncWriteReq(@Addr, 0xF005, @nHandl, 2, @sVar)
Mittels Handl Variablenwert schreiben ==> Wichtig Indexgroup F005
Mit dieser Methode könnte man auch Daten lesen
1. nErr = AdsSyncReadWriteReq(@Addr, 0xF003, 0, 4, @nHandl, len(sVar), @sVar)
Handl zu dem Variablennamen aus Steuerung lesen ==> Wichtig Indexgroup F003
2. nErr = AdsSyncReadReq(@Addr, 0xF005, @nHandl, AnzLesen, @ZielVar)
Mittels Handl Variablenwert lesen ==> Wichtig Indexgroup F005
*/
/*********************************************************************************************/
// AMS NET ID zusammenstellen z.B 5.5.53.83.1.1
Addr := stuff(Addr,1,1,chr(5))
Addr := stuff(Addr,2,1,chr(5))
Addr := stuff(Addr,3,1,chr(53))
Addr := stuff(Addr,4,1,chr(83))
Addr := stuff(Addr,5,1,chr(1))
Addr := stuff(Addr,6,1,chr(1))
// Portadresse zusammenstellen z.B 801
Addr := stuff(Addr,7,2,u2bin(801))
sVar := ".test_com"
AnzLesen := 20 // Anzahl Lesen in Bytes d.h. Word ==> *2 DWord *4
nErr = AdsSyncReadWriteReq(@Addr, 0xF004, 0, AnzLesen, @ZielVar, len(sVar), @sVar)
//********************************************************************************************/
for i:=1 to 10
y := (I*2) - 1
bWerte[i] := bin2u(substr(ZielVar,y,2))
next i
ZielVar := Space(200)
sVar := ".test_com"
nErr = AdsSyncReadWriteReq(@Addr, 0xF003, 0, 4, @nHandl, len(sVar), @sVar)
sVar := u2bin(125)
nErr = AdsSyncWriteReq(@Addr, 0xF005, @nHandl, 2, @sVar)
nErr = AdsSyncReadReq(@Addr, 0xF005, @nHandl, AnzLesen, @ZielVar)
for i:=1 to 10
y := (I*2) - 1
bWerte[i] := bin2u(substr(ZielVar,y,2))
next i
nErr :=AdsPortClose()
return
mkersch
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Anfängerfrage zu DLL
Hallo, Mkersch.
OS-Fehler 126 bedeutet: "The specified module could not be found." Das bedeutet nicht, dass eine Datei nicht gefunden werden konnte, sondern etwas Abhängiges. Entweder also stammen beide DLLs nicht aus derselben Version oder Du hast durch die diversen Versuche noch irgendwo Reste auf dem Testrechner. Lösch doch also mal alle Instanzen beider DLLs und stell sie ausschließlich im Ausführungsverzeichnis der App zur Verfügung.
OS-Fehler 126 bedeutet: "The specified module could not be found." Das bedeutet nicht, dass eine Datei nicht gefunden werden konnte, sondern etwas Abhängiges. Entweder also stammen beide DLLs nicht aus derselben Version oder Du hast durch die diversen Versuche noch irgendwo Reste auf dem Testrechner. Lösch doch also mal alle Instanzen beider DLLs und stell sie ausschließlich im Ausführungsverzeichnis der App zur Verfügung.
Herzlich,
Tom
Tom
Re: Anfängerfrage zu DLL
Hallo Forenmitglieder,
Ihr hattet recht, die ADSDLL benötigt noch eine weitere DLL Datei (in meinen Fall die TCATADSDLL.DLL).
D.h. wenn ich als erste DLL diese Lade, wird auch die ADSDLL korrekt geladen.
Vielen Dank für Eure Unterstützung
mfg.
mkersch
Ihr hattet recht, die ADSDLL benötigt noch eine weitere DLL Datei (in meinen Fall die TCATADSDLL.DLL).
D.h. wenn ich als erste DLL diese Lade, wird auch die ADSDLL korrekt geladen.
Vielen Dank für Eure Unterstützung
mfg.
mkersch