Anfängerfrage zu DLL

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Anfängerfrage zu DLL

Beitrag von mkersch »

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
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Anfängerfrage zu DLL

Beitrag von Rolf Ramacher »

Meines Wissens muß sich die DLL-Datei im gleichen Verzeichnis befinden, wie die entsprechende EXE-Datei. Mach doch vorher eine If File() - Abfrage.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Anfängerfrage zu DLL

Beitrag von brandelh »

Hi,
laut Handbuch und Erfahrungen ...
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.
ist c:\windows\system32 im Prinzip OK.
Tippfehler ?
Zugriffsrechte ?

Kopiere die DLL mal ins Programmverzeichnis, wenn es dann geht, fehlen dir Zugriffsrechte.

... das hast du ja schon gemacht ... :(
Gruß
Hubert
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Anfängerfrage zu DLL

Beitrag von mkersch »

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Anfängerfrage zu DLL

Beitrag von brandelh »

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 ?
Gruß
Hubert
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Anfängerfrage zu DLL

Beitrag von mkersch »

DllLoad("falscherName") bringt auch die Fehler Nr 126


Kann dies evtl mit dem DEBUGER xppdbg zusammenhängen ?

mfg.

mkersch
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Anfängerfrage zu DLL

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Anfängerfrage zu DLL

Beitrag von Tom »

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.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Anfängerfrage zu DLL

Beitrag von brandelh »

Tom hat geschrieben:Was soll "ADSDLL.DLL" sein? :?: Die ADSDBE lädt man durch "DBELoad("ADSDBE")".
das habe ich mich vorhin auch gefragt :D
mit dem ADS hat es nichts zu tun, es ist eine Schnittstelle für Hardwareansteuerung - soweit ich das verstanden habe:
Beckhoff ADS-Welt. ADS steht für "Automation Device Specification" und beschreibt eine Geräte- und Feldbusunabhängige Schnittstelle.
:arrow: http://infosys.beckhoff.com/index.php?c ... ro.htm&id=
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Anfängerfrage zu DLL

Beitrag von Martin Altmann »

:lol: Auf der Seite war ich auch gelandet - und dort steht, dass noch eine zweite DLL unbedingt dazu gehört:
Die ADSDLL.DLL und die TcADSDLL.DLL sind als Bundle zu behandeln und somit immer als Paket zu kopieren.
Darum auch mein Hinweis oben.

Viele Grüße,
Martin
:grommit:
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.
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Anfängerfrage zu DLL

Beitrag von mkersch »

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
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Anfängerfrage zu DLL

Beitrag von mkersch »

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.

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
mfg.

mkersch
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Anfängerfrage zu DLL

Beitrag von Tom »

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.
Herzlich,
Tom
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Anfängerfrage zu DLL

Beitrag von mkersch »

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
Antworten