DLL-Funktionsaufruf für Anfänger

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

DLL-Funktionsaufruf für Anfänger

Beitrag von Benz »

Hi, ich weiß hier gibts schon ein paar Beiträge für den Aufruf von DLLs, allerdings bin ich noch ein blutiger Anfänger auf diesem Gebiet, verstehe also nur Bahnhof :D.
Wäre es möglich, dass ihr das Thema so einfach wie möglich erklären könntet? Das würde mir ungemein helfen!
Ich habe nämlich im Moment eine API-Referenz vorliegen. Um diese zu nutzen muss ich wohl DLLs einbinden, da die Funktionen, die ich nutzen will darin versteckt sind.
Ich habe das schonmal so versucht:

Dll in denselben Pfad wie der Code, dann folgender Aufruf:

DLLload("diedll.dll")
Leider liefert mir die Funktion nHandle == 0 zurück, was ja jetzt eigentlich heißt, dass es einen Fehler beim Laden gab.
Anschließend habe ich den Pfad absolut eingegeben also DLLLoad("C:\...\diedll.dll"), aber das funktioniert leider genauso wenig.

Gibt es etwas, das man beachten muss?
Welche include-Dateien brauche ich dazu? Wenn ich #include "dll.ch" schreibe, kommt beim Compilieren der Fehler "invalide directive" auf eben diese Zeile.

Könntet ihr mir auch noch allgemein erklären wie DLLs funktionieren?
Sind die mit jeder Programmiersprache aufrufbar?

Ich habe die Xbase++ -Version 1.93055 ohne irgendwelche zusätzlichen Dinge, also keine zusätzlichen Bibliotheken von jemand anderem.

Liebe Grüße!
Zuletzt geändert von Benz am Fr, 17. Jun 2016 9:38, insgesamt 2-mal geändert.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von georg »

Hallo,


es gibt zwei "Richtungen".

Zum einen DLLs, die man selbst erstellt hat. Hierzu hast Du ein Beispiel auf Deinem Rechner, nämlich in

Code: Alles auswählen

C:\Alaska\XPPW32\source\samples\basics\DLL
Der zweite Fall ist der Aufruf einer externen DLL, wobei (fast) jede Windows-DLL in Frage kommt. Hierfür sind ein paar Schritte erforderlich:

Code: Alles auswählen

#INCLUDE "dll.ch"
#INCLUDE "xbp.ch"

FUNCTION Main()
   Local nDllHandle
   nDllHandle := DllLoad("ADVAPI32.DLL")
   IF nDllHandle > 0
      ConfirmBox(, "ADVAPI32 ist jetzt verfügbar.", "Erfolg", XBPMB_OK, XBPMB_INFORMATION)
      DllUnLoad(nDllHandle)
   ELSE
      ConfirmBox(, "ADVAPI32 ist nicht verfügbar.", "Fehler", XBPMB_OK, XBPMB_CRITICAL)
   END
RETURN(.T.)
Danach kannst Du - unter Verweis auf das DLL-Handle mit der DLL "arbeiten", d.h. Funktionen ausführen, die in der DLL enthalten sind. "Einfache" Datentypen kann Xbase++ selbst konvertieren, so dass man z.B. so auf Registry-Daten zugreifen kann:

Code: Alles auswählen

nCallSuccess := DllCall( ::nDllHandle, DLL_STDCALL, "RegOpenKeyExA", ::nhKey, cSubKey, 0, nAccess , @nNewKeyHandle)
Dieses Beispiel habe ich irgendwo rauskopiert. Es zeigt, dass das Handle zuerst angegeben wird, dann der Zugriffstyp, danach die auszuführende Funktion, und im Anschluss daran die Parameter.

Für komplexere Strukturen gibt es das BAP (Binary Access Package), das über die Alaska-Interseite zum Download bereitsteht.

Ich gehe mal davon aus, dass man aus einem Xbase++ Programm (= 32 bit Anwendung) nur 32 bit DLLs aufrufen kann, habe es aber noch nicht versucht. Vielleicht gibt das interessante Effekte.

Und noch der Hinweis auf unsere WiKi, aber der Artikel ist noch in Arbeit: http://wiki.xbaseentwickler.de/index.ph ... ittstellen

Ich hoffe, für eine erste Einführung genügt das.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von AUGE_OHR »

georg hat geschrieben:Ich gehe mal davon aus, dass man aus einem Xbase++ Programm (= 32 bit Anwendung) nur 32 bit DLLs aufrufen kann, habe es aber noch nicht versucht.
YUP ... aber es gibt keine Meldung wenn man versucht eine 64bit DLL zu laden.
man kann es aber damit testen
Dateianhänge
dll6432.zip
need Ot4xb
(372.3 KiB) 356-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von AUGE_OHR »

Benz hat geschrieben:Welche include-Dateien brauche ich dazu?
siehe dir doch mal die DLL.CH an ;)

in den Include Datei stehen meistens Konstanten. wenn du also Konstanten verwenden willst benötigst du die Include Datei sonst nicht.
Benz hat geschrieben:Wenn ich #include "dll.ch" schreibe, kommt beim Compilieren der Fehler "invalide directive" auf eben diese Zeile.
hm ... es gibt auch paar #xtranslate in der DLL.CH ...
gruss by OHR
Jimmy
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Benz »

Danke für die Antworten, das hilft mir schonmal weiter im Verständnis. Leider löst das mein Problem noch nicht ganz, aber ich denke, ich habe die Lösung mehr oder weniger in einer anderen Programmiersprache gefunden.
Und zwar die folgende:

Das hier habe ich in einem Beispiel gefunden, die Programmiersprache ist c#:

Code: Alles auswählen

        private static extern bool SetDllDirectory(string lpPathName);

        [DllImport("dllname", CharSet = CharSet.Ansi, BestFitMapping = true,
               ThrowOnUnmappableChar = false)]
Die Microsofthilfe bietet folgende Erklärung für SetDllDirectory:
Parameters
lpPathName [in, optional]

The directory to be added to the search path. If this parameter is an empty string (""), the call removes the current directory from the default DLL search order. If this parameter is NULL, the function restores the default search order.
(auch unter dem Link: http://msdn.microsoft.com/en-us/library ... s.85).aspx).

Also so wie es aussieht ist die DLL, die ich gerne vernwenden würde, in irgendeiner Weise nicht im allgemeinen DLL-Pfad registriert oder etwas in der Art, deshalb verwenden die Macher dieses Beispiels die Funktion SetDllDirectory um auf den Pfad der DLL hinzuweisen und sie so einzubinden. Ich denke mal, das
ist auch mein Problem in Xbase, allerdings fällt es mir schwer eine Funktion in Xbase zu finden, die dasselbe macht. Hat da jemand einen Vorschlag dazu?
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Tom »

So, wie es aussieht, verwendet die DLL, die Du einbinden möchtest, weitere Komponenten. Das können andere DLLs sein, die von dieser DLL wiederum geladen werden, oder auch Typbibliotheken (TLB). Jedenfalls fehlt irgendwas, das diese DLL benötigt. Es dürfte hilfreich sein, die DLL und ihre Komponenten, die Du verwenden möchtest, komplett ins Installationsverzeichnis Deiner App zu kopieren (und von dort auch zu laden) - und so auch auszuliefern. Damit vermeidet man auch Versionskonflikte, denn es gibt ja die Möglichkeit, dass beim Kunden andere Programme installiert sind, die auch diese Komponente nutzen, aber möglicherweise eben in anderen Versionen. Üblicherweise gibt es bei Komponenten, die so verwendet werden können, ein "BIN"- oder "RUNTIME"-Verzeichnis, in dem sich alles befindet, was die Komponente benötigt, um laufen zu können.

SetDLLDirectory ist eine Windows-API-Funktion aus der KERNEL32.DLL. Sie ergänzt den Suchpfad des Betriebssystems beim Laden von DLLs um den angegebenen Pfad. Das sollte auch funktionieren. Die Syntax in Xbase++ wäre diese hier:

Code: Alles auswählen

#include 'dll.ch'

DLLFUNCTION SetDllDirectoy(cPathName) USING STDCALL FROM KERNEL32.DLL
Und dann:

Code: Alles auswählen

SetDllDirectory("C:\MeineDLL")
(ungetestet)

Ob die DLL dann aber ihre Komponenten findet, weiß ich nicht.

Wenn aber schon #include 'dll.ch' fehlschlägt, findet der Präprozessor die DLL.CH vermutlich nicht. Offenbar stimmt die Xbase++-Installation nicht (ganz).
Herzlich,
Tom
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Benz »

Danke!! Ich denke, jetzt habe ich den entscheidenden Baustein für mein Problem noch bekommen!
ich habe das mit der dll.ch nochmal versucht und jetzt geht es auf einmal :shock:
Seltsam. Muss wohl irgendetwas falsch gemacht haben.

Ich versuch mal, ob das so funktioniert, dann schreibe ich nochmal :), schonmal vielen Dank an alle!
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Benz »

hm irgendwie will das nicht so richtig. Es kommt immer der Fehler im Anhang.

Ich habe jetzt 2 Varianten versucht:

EInmal das hier:

Code: Alles auswählen


#include dll.ch
DLLFUNCTION SetDllDirectory(cPathName) USING STDCALL FROM KERNEL32.DLL  

.. weitere includes ..

PROCEDURE AppSys
RETURN
PROCEDURE Main()

SetDllDirectory(meinPfad) 

DLLLoad("meineDLL.dll")


RETURN

so kommt dann beim linek "unresolved external symbol SetDllDirectory

und dann noch das hier:

Code: Alles auswählen


#include dll.ch

.. weitere includes ..

PROCEDURE AppSys
RETURN
PROCEDURE Main()

     DllCall( "KERNEL32.DLL"   , DLL_STDCALL, ;
                "SetDllDirectory","meinPfad")
     DLLLoad("meineDLL.dll")

RETURN

Dateianhänge
Das ist der Fehler der auftritt, wenn ich das erste Codebeispiel schreibe. in Zeile 21 steht DLLFUNCTION ...
Das ist der Fehler der auftritt, wenn ich das erste Codebeispiel schreibe. in Zeile 21 steht DLLFUNCTION ...
DLLFUNCTION_fehler.png (19.9 KiB) 13515 mal betrachtet
Das ist der Fehler, wenn ich da zweite Codebeispiel schreibe
Das ist der Fehler, wenn ich da zweite Codebeispiel schreibe
Unbenannt.png (19.98 KiB) 13515 mal betrachtet
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von georg »

Hallo,


also, die DllPrepareCall() Funktion benötigt die XppRT1.DLL. Die sollte m.E. standardmässig gelinkt werden.

Füge mal die Anweisung im Kopf des Programms hinzu:

Code: Alles auswählen

#PRAGMA Library("XppRT1.LIB")
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Tom »

Die einzubindende Funktion heißt "SetDllDirectoryA". Der Rückgabewert sollte dann ungleich null sein. Ist er null, ging es nicht. Welche Wirkung das tatsächlich hat, kann ich Dir aber nicht sagen.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Tom »

Code: Alles auswählen

#include 'dll.ch'

* Funktion zum Setzen:
DLLFUNCTION SetDllDirectoyA(cPathName) USING STDCALL FROM KERNEL32.DLL

* Gegenfunktion zum Abrufen:
DLLFUNCTION GetDllDirectoyA(nBufferLenght,@cPathName) USING STDCALL FROM KERNEL32.DLL

? SetDllDirectoryA("c:\meinedlls") // Antwort z.B. "1"
c := Space(255)
? GetDllDirectoryA(255,@c) // Antwort z.B. "9"
? c // "c:\meinedlls"
Herzlich,
Tom
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Benz »

Sehr gut, danke, jetzt funktioniert es!!
Was ich nur seltsam finde ist der Umstand, dass die Funktion SetDllDirectoryA heißt, weil in meinem Beispiel steht es tatsächlich nur als SetDllDirectory ohne das "A" und das Beispiel funktioniert trotzdem.
Es wird auch an keiner Stelle aus SetDllDirectoryA das SetDllDirectory gemacht.

Egal, hauptsache es funktioniert!! :D Vielen Dank :!: :!:
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Tom »

Freut mich! Funktioniert nun auch der Aufruf aus der Fremd-DLL, um die es ursprünglich ging?

Solche Windows-API-Funktionen gibt es in aller Regel in zwei, drei oder noch mehr Versionen, nämlich beispielsweise ohne Buchstaben-Suffix, wenn diese Funktion keine Textparameter kennt/entgegennimmt, und dann in zwei weiteren Versionen, mit einem "A" für ANSI und einem "W" für Unicode (Du könntest also auch SetDllDirectoryW benutzen). Wenn die Funktion Textparameter kennt, kann es - wie hier - sein, dass sie ohne Suffix überhaupt nicht existiert. Leider ist die Windows-API nirgendwo übersichtlich zusammenhängend dokumentiert, weil es Hunderttausende Funktionen gibt, die zuweilen ziemlich unterschiedlich arbeiten/parametrisiert werden. Die unabhängigen Sites, die solche Sammlungen enthalten, sind zudem leider nicht verlässlich (oder sogar Mistangebote, die Drive-by-Downloads versuchen).
Herzlich,
Tom
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Benz »

Ja das funktioniert jetzt!! :) *DAUMEN HOCH*

Schade eigentlich, mit den Funktionen lässt sich bestimmt so einiges anstellen :D aber vielleicht ist das ja beabsichtigt, dass das nicht so gut dokumentiert ist, um
die Nutzung der Funktionen einzudämmen. Wer weiß das schon bei Microsoft :|
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von AUGE_OHR »

Benz hat geschrieben:Schade eigentlich, mit den Funktionen lässt sich bestimmt so einiges anstellen :D
aber vielleicht ist das ja beabsichtigt, dass das nicht so gut dokumentiert ist, um die Nutzung der Funktionen einzudämmen. Wer weiß das schon bei Microsoft :|
wenn du beim suchen hinter die API Function den Begriff "msdn" hängst kommst du schnell an ordentliche Treffer wie
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: DLL-Funktionsaufruf für Anfänger [ERLEDIGT]

Beitrag von Tom »

Schade eigentlich, mit den Funktionen lässt sich bestimmt so einiges anstellen
Zum Beispiel Compiler für Windows bauen. :wink:

Tatsächlich nutzt man, wenn man für Windows programmiert, die API ziemlich intensiv, denn dafür ist sie da: Die Abkürzung steht für "Application Programming Interface". Die meisten Funktionalitäten bildet ein Compiler bzw. eine Entwicklungsumgebung auf Sprachebene ab. Wenn Du Controls verwendest, vom Dialog über die SLE bis zur Listbox, steht dahinter die Kommunikation mit der Windows-API.

Allerdings wrappen nicht alle Sprachen sämtliche Funktionalitäten, die das Betriebssystem anbietet. Das liegt einerseits daran, dass bestimmte Funktionen nur in bestimmten Betriebssystemversion vorhanden sind, während die Sprache - beispielsweise Xbase++ - theoretisch für alle 32/64-Bit-Windows-Versionen laufen sollte. In Windows 95, 98 oder NT gibt es "SetDllDirectory" (noch) nicht. Andere API-Funktionen, mit denen man beispielsweise die Fenstertransparenz setzen kann, waren erst ab XP verfügbar. Mit Windows 7 und 8 sind wieder weitere Funktionen hinzugekommen, um die Gestensteuerung, Kacheln und andere Elemente zu verwenden. Würde die Sprache all das berücksichtigen, müsste man je Zielsystem neu kompilieren. Da ist es einfacher, wenn die Applikation zur Laufzeit prüft, welche Version vorliegt, um dann beispielsweise über Voreinstellungen Fenstertransparenzen zuzulassen, die ja nun wirklich wesentliches Gestaltungselement sind, sondern in den meisten Fällen ein reines Gimmick. Anders gesagt: Eine Applikation, die den Standardumfang der Sprache berücksichtigt, wird immer auf allen Betriebssystemversionen laufen, während eine, die tief in der API herumfuchtelt, ständig aufpassen muss, welches OS läuft. Tatsächlich ziehen die Compilerhersteller in aller Regel kurzfristig nach. Alaska Software hat sich allerdings zum Beispiel mit den visuellen Stilen, die ab XP verwendbar waren, ziemlich viel Zeit gelassen, und man musste vorher ganz schön tricksen, um das in einer Xbase++-Applikation verwenden zu können.

Grundsätzlich aber ist die Schnittstelle da - eben per DLL-Call. Von den vielen tausend Funktionen, die es da gibt, sind aber im Alltag von Geschäftsanwendungen nur wenige wirklich relevant. Auch das Beispiel, um das es hier geht, würde ich nicht verwenden, da ich es bevorzuge, alle Fremdkomponenten, die wir benutzen, mit/in der Applikation zu installieren. Im umgekehrten Fall (der Benutzer kann einstellen, wo eine Komponente installiert ist) generiert man nur Aufwand für den Support und Fehlerquellen. Arbeitet man allerdings exklusiv für einzelne Kunden, mag das anders sein.

Leider ist es wirklich schwer, in der API zu stöbern. Früher gab's mal Bücher, die derlei zusammengefasst und mit Beispielen veranschaulicht haben, aber die immer kürzer werdenden Produktzyklen und die dadurch mäßige Aktualität solcher Bücher haben den Markt praktisch zum Erliegen gebracht. Microsoft selbst bietet eine Art Tutorial an:

http://msdn.microsoft.com/de-de/library ... 85%29.aspx

Ansonsten muss man, wie Jimmy bereits ausgeführt hat, im MSDN gezielt nach Funktionen suchen. Das kann man auch hier, im Forum. Für die o.g. Fenstertransparenz und einige andere Dinge gibt es hier Beispiele und Erläuterungen.
Herzlich,
Tom
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: DLL-Funktionsaufruf für Anfänger [ERLEDIGT]

Beitrag von Benz »

Klingt alles höchst interessant! Wenn ein Tag doch nur 48 Stunden hätte :D. Naja vielleicht führt mich ja mal eine Anwendung in das Gebiet.
@Tom
Wie meinst du das mit dem direkt installieren?
Wenn ich nur einen DLL als Fremdkomponente habe, muss ich diese ja trotzdem aufrufen, egal, ob ich sie im Installationsverzeichnis habe oder nicht, oder?
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: DLL-Funktionsaufruf für Anfänger [ERLEDIGT]

Beitrag von Benz »

Hi, ich muss das Thema nochmal etwas auffrischen, und zwar habe ich mit Visual Studio C# eine DLL erstellt, indem ich einfach ein Projekt "Klassenbibliothek (portierbar für iOS, Android und Windows" angelegt habe, diesen Code eingefügt:

Code: Alles auswählen

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
    public class Class1
    {
        public int strlength(string s)
        {
            return s.Length;
        }

    }
}
und mit STRG+B einen Build ausgeführt.

Wenn die die DLL nun in einem anderen Visual Studio Projekt lade (mit folgendem Code):

Code: Alles auswählen

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ClassLibrary1;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Class1 test = new Class1();
            MessageBox.Show(test.strlength("oioih").ToString());
        }
    }
}
daann funktioniert das einwandfrei (die DLL heißt ClassLibrary1.dll und ich habe sie in das Hauptverzeichnis des 2. Projekts kopiert), also die DLL wird geladen und die Class kann aufgerufen und ausgeführt werden.


Jetzt versuche ich gerade die DLL in einem Xbase-Programm zu laden, was ja eigentlich möglich sein sollte oder nicht?

Oder muss ich zuerst die DLL in tatsächlichen Maschinencode umwandeln, dass ich sie mit Xbase aufrufen kann, da Visual Studio über das .NET Framework nur diesen Zwischencode erzeugt?
Weiß das jemand?
Ich habe versucht die DLL, angelehnt an das Beispiel "XPPW32\source\samples\basics\DLL\main.prg" und dort 6. einzufügen, das hat aber leider nicht funktioniert. Ich habe die Compilerverion 1.90355.

Das ist mein bisheriger COde:

Code: Alles auswählen

//////////////////////////////////////////////////////////////////////
//
//  Copyright:
//        Your Copyright goes here., (c) 2000. All rights reserved.
//
//  Contents:
//        This is a standard win32 exe.
//
//////////////////////////////////////////////////////////////////////

  #include "Common.ch"
  #include "Font.ch"
  #include "Gra.ch"
  #include "Xbp.ch"
  #include "AppEdit.ch"
  #include "AppBrow.ch"
  #include "Appevent.ch"
  #include "Fileio.ch"
  #include "ace.ch"
  #include "dll.ch"

  #pragma Library( "XppUI2.LIB" )
  #pragma Library( "XppUi2.lib" )

  #pragma Library("AppClass.lib")                 // for use the tbxClasses
  #pragma Library("AceServer.Lib")                // for use data access
  #pragma Library("XppUi3.Lib")                   // for use new XbParts and alignment
  #pragma Library("XbpPack.Lib")
  #pragma Library("tbxExtCtrl.Lib")
  #pragma Library("XppUI2.Lib")
  #pragma Library("cjx.Lib")
  #pragma Library("XPPRT1.LIB")
  #pragma Library( "Adac20b.lib" )
  #PRAGMA Library("XppRT1.LIB")



/* Overloaded AppSys which does nothing
 */
PROCEDURE AppSys

   /* use the ANSI charset by default */
   SET CHARSET TO ANSI

   /* $TODO: create your application container here */
RETURN

/* This is our main procedure
 */
PROCEDURE Main
LOCAL nHandle
	LOCAL oClass
LOCAL oTest
LOCAL memtest	
LOCAL xRet

	msgbox("Oih")[code]
nHandle := DllLoad( "ClassLibrary1.dll" )
msgbox(var2char(nHandle))

oClass := &("Class1")()
oTest := Class1:new()
memtest := Class1:strlength("kklla")
? memtest

DllUnload( "ClassLibrary1" )

RETURN
[/code]

Wenn ich das mit einer bat Datei im Hauptverzeichnis compiliere (folgender Code):

Code: Alles auswählen

xpp main 
alink main /PM:PM
pause
main
bekomme ich die angehängte Fehlermeldung

Weiß jemand wie ich das besser machen kann?
Dateianhänge
fehler.PNG
fehler.PNG (19.86 KiB) 12288 mal betrachtet
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von brandelh »

Es gab vor ewigen Zeiten mal ein Dokument von Alaska der den Aufruf von .NET DLLs zeigte, aber wie und wo weiß ich nicht.

Ich rufe nur normale DLL auf.
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Werner_Bayern »

Servus,

ist es nicht so, dass man nur C - aber keine C# - DLLs aus Xbase++ aufrufen kann? Oder es liegt daran, dass Du nicht so ohne weiteres eine Klassenstruktur aus einer C#-DLL in Xbase++ verwenden kannst.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Benz »

Und es gibt keinen Weg, dass das irgendwie doch funktioniert?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von brandelh »

Alaska fragen, die haben da ein altes how to ... ;-)
Gruß
Hubert
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Benz »

Und würde das mit dem 2.0 Xbase++ gehen ? :D weiß das jemand?
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Jan »

Man kann (nach einer Anmeldung auf dem eigenen Konto) bei Alaska eine ZIP herunter laden "How to use .Net components from Xbase++", da ist auch eine dot_net.pdf mit drin. In wie weit das noch aktuell ist weiß ich nicht, das Teil ist von 2002 ...m Das mag immer noch richtig sein, aber heute mit neueren Funktionen beser gehen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: DLL-Funktionsaufruf für Anfänger

Beitrag von Tom »

In wie weit das noch aktuell ist weiß ich nicht, das Teil ist von 2002
Warum sollte das nicht mehr aktuell sein? Die letzte funktionierende Xbase++-Version ist doch älter. :badgrin:
Herzlich,
Tom
Antworten