Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi OLE. DLL Zugriff. XE2 (https://www.delphipraxis.net/182708-ole-dll-zugriff-xe2.html)

matashen 12. Nov 2014 14:18

OLE. DLL Zugriff. XE2
 
Hallo zusammen,

der Titel ist etwas abgehakt aber im Prinzip gehts genau darum.

Ich habe für einen Zugriff auf unseren MES-Server eine dll. Ein Kollege von mir hat in Delphi (Ich glaube Turbo Delphi) eine Beispielanwendung geschrieben für den Zugriff über die dll auf unseren MES-Server.

Wenn ich einen Zugriff mit meinem XE2 auf den Server mache bekomme ich entweder eine Rückmeldung von der dll "-1000: Server nicht gefunden" oder eine Meldung "OLE Fehler FFFFFFF".

das heist ich kompilier auch nur die Beispielanwendung von meinem Kollegen. Bei meinem XE2 gehts nicht. Bei seinem Uralt-Delphi gehts.

Ist da ein bekannter Fehler in XE2. Updates hät ich aber alle inkl. des letzten Hotfix.

Langsam glaub ich nicht an einen Fehler meinerseits sondern an einen Fehler vom XE2. Das Netz hab ich mir heute schon Wund-gegoogelt aber auf eine Lösung bin ich nicht gestoßen.

Evtl. hat jemand von euch da Erfahrungen/Informationen.

Gruß Matthias

baumina 12. Nov 2014 14:41

AW: OLE. DLL Zugriff. XE2
 
Das ist sicherlich ein UniCode-Problem. Achte auf PChar -> PAnsiChar usw.

matashen 12. Nov 2014 15:02

AW: OLE. DLL Zugriff. XE2
 
Naja wenn ich einfach den Severstatus abfrage läuft nicht viel Text

mal hier der Auszug

Delphi-Quellcode:
    Path := ExtractFilePath(ParamStr(0))+'mes_toolbox.dll';   // Wenn Dll im gleichen Pfad wie die Exe liegt.
    DLL := PChar(Path);
    DLLHandle := LoadLibrary(DLL);
    checkptr:= GetProcAddress(DLLHandle,'CHECK_DB_CONNECTION');
    @DLLCheck:= CheckPtr;
    j:=dllcheck;
    if j=0 then statusbar1.panels[0].Text:=inttostr(j)+' Datenbank Verbindung OK';
    if j=-1000 then statusbar1.panels[0].Text:=inttostr(j)+' Fehler: keine Verbindung zur DB';

baumina 12. Nov 2014 15:17

AW: OLE. DLL Zugriff. XE2
 
Versuch mal

Delphi-Quellcode:
// DLL := PChar(Path);
strPCopy(DLL,Path);
EDIT: Aber ich denke das hilft nix. Wenn dein DLLHandle sowieso schon gültig war, ausser du hast das nie geprüft.

matashen 12. Nov 2014 15:38

AW: OLE. DLL Zugriff. XE2
 
Also wenn ich
strPCopy(DLL,Path);
einsetze, krachts und es kommt zu einer Zugriffsverletzung.


Delphi-Quellcode:
 TCheck_DB_Connection = Function:integer;stdcall;
....
    DLLGET_Batch_INFOS_XML :TGET_BATCH_INFOS_XML;
    DLLCheck              :TCheck_DB_Connection;
    DLLHandle            :THandle;
    DLL                  :Pchar;
dürfte auch passen? Oder muss ich das anders deklarieren.

matashen 12. Nov 2014 16:14

AW: OLE. DLL Zugriff. XE2
 
2.1 Funktionsprototyp / Parameter
Die meisten Funktionen haben folgenden Aufbau:
function FunktionsName_XML (pIn:pchar;pOut:pchar;size:integer):integer;export ;stdcall;
Parameter: pIn Struktur für Eingabeparameter
pOut Puffer für die Struktur der Ausgabeparameter
size Größe des Ausgabepuffers pOut in Byte
Parameterstruktur:
Die In,-Out-Parametern werden in einer XML Struktur übergeben

mkinzler 12. Nov 2014 16:19

AW: OLE. DLL Zugriff. XE2
 
Dann Ändere hier PChar nach PAnsiChar. Die Dll wird kein Unicode verstehen

himitsu 12. Nov 2014 16:41

AW: OLE. DLL Zugriff. XE2
 
In diesem Beispiel wird aber nirgendwo PChar verwendet. (jedenfalls nicht für die gezeigten Schnittstellen zur DLL -> DLLCheck/CHECK_DB_CONNECTION hat weder entsprechenden Parameter noch Result)

Der Code aus #1 einfach nur etwas gekürzt.
Delphi-Quellcode:
DLLHandle := LoadLibrary('mes_toolbox.dll'); // Windows sucht sowieso zuerst im Programmverzeichnis
DLLCheck := GetProcAddress(DLLHandle, 'CHECK_DB_CONNECTION'); // siehe (1)
Assert(Assigned(DLLCheck));
j := DLLCheck;
if j = 0 then StatusBar1.Panels[0].Text := IntToStr(j) + ' Datenbank Verbindung OK';
if j = -1000 then StatusBar1.Panels[0].Text := IntToStr(j) + ' Fehler: keine Verbindung zur DB';
1) Links vom
Delphi-Quellcode:
:=
baut Delphi implizit ein
Delphi-Quellcode:
@
ein.
Bzw. ist es hier eigentlich andersrum, denn Delphi baut bei Prozedurzeigern implizit immer ein
Delphi-Quellcode:
^
(Dereferenzierung) ein und lässt es bei einer Zuweisung implizit weg, außer man macht ein explizites @ davor.

Die Funktionen LoadLibrary und GetProcAddress werden nicht in der DLL ausgeführt.
Das Einzige, wo es hier Probleme geben könnte, wenn "Path" kein String, sondern z.B. ein AnsiString ist. (ab Delphi 2009)


Nutzt die DLL sowas wie ShareMem?
Oder gibt es noch weitere exportierte Funktionen, wo es knallt?

mkinzler 12. Nov 2014 16:46

AW: OLE. DLL Zugriff. XE2
 
Wie ist die Funktion CHECK_DB_CONNECTION deklariert?

himitsu 13. Nov 2014 07:42

AW: OLE. DLL Zugriff. XE2
 
Die Antwort wurde heimlich in #5 versteckt.
Zitat:

Zitat von matashen (Beitrag 1279499)
Delphi-Quellcode:
 TCheck_DB_Connection = Function:integer;stdcall;



Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz