Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler beim DLL aufruf (https://www.delphipraxis.net/158581-fehler-beim-dll-aufruf.html)

Gehstock 22. Feb 2011 23:53

Delphi-Version: 2005

Fehler beim DLL aufruf
 
die DLL exportiert mehrere Funktionen z.B.

Delphi-Quellcode:
function CountryCodeToMCC(CountryCode: String): Integer;
var
  i: Integer;
begin
  result := 0;
  i := 0;
  while TabHWName[i].MNC < 999 do
  begin
    if UpperCase(CountryCode) = UpperCase(TabHWName[i].CountryCode) then
    begin
      result := TabHWName[i].MCC;
      break;
    end;
    inc(i);
  end;
end;

function MCCToCountry(MCC: Integer): String;
var
  i: Integer;
begin
  result := '';
  i := 0;
  while TabHWName[i].MNC < 999 do
  begin
    if MCC = TabHWName[i].MCC then
    begin
      result := TabHWName[i].Country;
      break;
    end;
    inc(i);
  end;
end;
aufrufen tue ich mit

Delphi-Quellcode:
function CountryCodeToMCC(CountryCode: String): Integer; cdecl; external 'ProviderDLL.dll';
function MCCToCountry(MCC: Integer): String; cdecl; external 'ProviderDLL.dll';
wobei die erste tut was sie soll, die 2 (und auch alle anderen Funktionen aber eine exception werfen)



Zitat:

---------------------------
Dlltest
---------------------------
Zugriffsverletzung bei Adresse 002C4EAA in Modul 'ProviderDLL.dll'. Lesen von Adresse 00194000.
---------------------------
OK
---------------------------
die Funktionen sind alle getestet und tun was sie sollen also schein ich beim Aufruf was falsch zu machen

Luckie 23. Feb 2011 00:09

AW: Fehler beim DLL aufruf
 
Stimmt die Aufrufkonvention?

Gehstock 23. Feb 2011 00:16

AW: Fehler beim DLL aufruf
 
Sollte bei stdcall crasht die DLL sofort

Assarbad 23. Feb 2011 00:57

AW: Fehler beim DLL aufruf
 
Und? Wenn du schon so lustig mit Strings herumwirfst, benutzt du dann auch den korrekten Speichermanager damit sich die Strings aus deiner Anwendung und die aus der DLL auch miteinander vertragen?

Bummi 23. Feb 2011 06:25

AW: Fehler beim DLL aufruf
 
PCHAR oder Sharemem...

Assarbad 23. Feb 2011 06:38

AW: Fehler beim DLL aufruf
 
Zitat:

Zitat von Bummi (Beitrag 1083705)
PCHAR oder Sharemem...

Genau. :zwinker:

PCHAR aber bitte nur mit Abzählen ;) ... ach und wenn wir schon wissen daß Delphi jetzt auch Unicode kann, sollten wir vielleicht explizit PAnsiChar oder PWideChar verwenden.

geskill 24. Feb 2011 00:08

AW: Fehler beim DLL aufruf
 
Was spricht gegen den WideString? Einen PChar muss man, wenn man in String umwandeln will immer explizit konvertieren (oder umgekehrt).

Assarbad 24. Feb 2011 01:33

AW: Fehler beim DLL aufruf
 
Zitat:

Zitat von geskill (Beitrag 1083943)
Was spricht gegen den WideString? Einen PChar muss man, wenn man in String umwandeln will immer explizit konvertieren (oder umgekehrt).

Es spricht nichts dagegen, solange man ShareMem benutzt (was unter anderem eine weitere DLL voraussetzt, borlndmm.dll oder so ...).

Strings in Delphi basieren auf Compiler Magic ... entsprechend muß man dem Compiler die Möglichkeit geben diese "Zauberei" anzuwenden. Wenn Anwendung und DLL sich nicht den gleichen Speichermanager teilen, gibt's Probleme. Sollte eigentlich Grundwissen für jeden Delphianer sein.

Björn Ole 24. Feb 2011 01:47

AW: Fehler beim DLL aufruf
 
WideStrings lassen sich ohne Probleme zischen DLLs hin und herschieben, auch ohne ShareMem. Ich verweise auf diesen Beitrag von Apollonius.

Assarbad 24. Feb 2011 02:33

AW: Fehler beim DLL aufruf
 
Zitat:

Zitat von Björn Ole (Beitrag 1083947)
WideStrings lassen sich ohne Probleme zischen DLLs hin und herschieben, auch ohne ShareMem. Ich verweise auf diesen Beitrag von Apollonius.

Gut, wieder was gelernt. Wenn das über BSTR implementiert ist, macht es Sinn. Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 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