Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Änderungen von XE3 zu XE4 (https://www.delphipraxis.net/175739-aenderungen-von-xe3-zu-xe4.html)

sh17 13. Jul 2013 13:31

Delphi-Version: 5

Änderungen von XE3 zu XE4
 
Ich habe gerade die DragAndDrop Komponenten für XE4 überarbeitet. Dabei habe ich ein paar Probleme:

Methoden-Variablen können nicht mehr auf nil geprüft werden, ist das richtig?

Delphi-Quellcode:
var
  _CopyStgMedium: function(const cstgmedSrc: TStgMedium; var stgmedDest: TStgMedium): HResult; stdcall = nil;

  if (@_CopyStgMedium = nil) then

  ist jetzt

  if not Assigned(@_CopyStgMedium) then

DWORD muss durch CppULongInt ersetzt werden, wenn man einen Pointer darauf haben möchte?

Delphi-Quellcode:
var
  SubKey: HKey;
  NumSubKeys, NumValues: DWORD; ---> CppULongInt
  p: PChar;
begin
  p := nil;
  repeat
    Result := False;
    if (RegOpenKey(HKEY_CLASSES_ROOT, PChar(Key), SubKey) = ERROR_SUCCESS) then
      try
        Result := (RegQueryInfoKey(SubKey, nil, nil, nil, @NumSubKeys, nil, nil,
          @NumValues, nil, nil, nil, nil) = ERROR_SUCCESS);


GetProc spinnt

Delphi-Quellcode:
    GetProc('MAPIGetDefaultMalloc@0', @MAPIGetDefaultMalloc);

ersetzt durch

    @MAPIGetDefaultMalloc := GetProcAddress(MAPI32, 'MAPIGetDefaultMalloc@0');

hier komme ich nicht weiter
kommt
[dcc32 Fehler] DragDropInternet.pas(1554): E2010 Inkompatible Typen: 'Pointer' und 'TMAPIAllocateBuffer'

Delphi-Quellcode:
type
  TMAPIAllocateBuffer = function(cbSize: ULONG; var lppBuffer: pointer): SCODE; stdcall;

var
  MAPIAllocateBuffer: TMAPIAllocateBuffer = nil;
  ...

    OleCheck(OpenIMsgOnIStg(FSession,
      @MAPIAllocateBuffer,
      @MAPIAllocateMore,
      @MAPIFreeBuffer,
      IMalloc(MapiGetDefaultMalloc),
      nil,
      FStorages[Index],
      nil, 0, 0,
      Result));

Bernhard Geyer 13. Jul 2013 13:36

AW: Änderungen von XE3 zu XE4
 
Zitat:

Zitat von sh17 (Beitrag 1221621)
DWORD muss durch CppULongInt ersetzt werden, wenn man einen Pointer darauf haben möchte?

Ein Pointer braucht 4 bzw. 8 Byte je nach Compilierung für Win32 oder Win64.
Ein DWORD ist immer 4 Byte lang. Also braucht man einen entsprechend großen Typ. Als generischer Typ wurde hier NativeInt eingeführt.
Aber wieso nicht gleich Pointer verwenden wenn es ein Pointer ist?

sh17 13. Jul 2013 13:44

AW: Änderungen von XE3 zu XE4
 
ich habe mir die Quelle von PDWORD angeschaut :(

sh17 13. Jul 2013 13:47

AW: Änderungen von XE3 zu XE4
 
RegQueryInfoKey hätte gern ein PDWORD auf NumSubKeys, was vorher ein DWORD war. geht nicht mehr, hab ich CppULongInt genommen, NativeInt geht nicht

jaenicke 13. Jul 2013 15:13

AW: Änderungen von XE3 zu XE4
 
Das ist leider wirklich eine Änderung, die viele Quelltexte anpassungsbedürftig machen dürfte... Eine Antwort wie jemand auf die Idee kommen kann einen Pointer auf einen DWORD (was ja schon der Name PDWORD impliziert) plötzlich auf einen anderen Typ zeigen zu lassen, habe ich leider auch nicht...
http://qc.embarcadero.com/wc/qcmain.....aspx?d=115307
http://qc.embarcadero.com/wc/qcmain.....aspx?d=115426

Thomas_K 17. Jul 2013 11:18

AW: Änderungen von XE3 zu XE4
 
Zitat:

Zitat von sh17 (Beitrag 1221621)
Ich habe gerade die DragAndDrop Komponenten für XE4 überarbeitet. Dabei habe ich ein paar Probleme:

hier komme ich nicht weiter
kommt
[dcc32 Fehler] DragDropInternet.pas(1554): E2010 Inkompatible Typen: 'Pointer' und 'TMAPIAllocateBuffer'

Delphi-Quellcode:
type
  TMAPIAllocateBuffer = function(cbSize: ULONG; var lppBuffer: pointer): SCODE; stdcall;

var
  MAPIAllocateBuffer: TMAPIAllocateBuffer = nil;
  ...

    OleCheck(OpenIMsgOnIStg(FSession,
      @MAPIAllocateBuffer,
      @MAPIAllocateMore,
      @MAPIFreeBuffer,
      IMalloc(MapiGetDefaultMalloc),
      nil,
      FStorages[Index],
      nil, 0, 0,
      Result));

ich hab das rein "Intuitiv" so abgeändert

Delphi-Quellcode:

    OleCheck(OpenIMsgOnIStg(FSession,
  {$IF CompilerVersion >= 25.0}
      pointer(@MAPIAllocateBuffer),  
      pointer(@MAPIAllocateMore),      
      pointer(@MAPIFreeBuffer),        
  {$ELSE}
      @MAPIAllocateBuffer,
      @MAPIAllocateMore,
      @MAPIFreeBuffer,
  {$ENDIF}
      IMalloc(MapiGetDefaultMalloc),
      nil,
      FStorages[Index],
      nil, 0, 0,
      Result));
Ist das so OK?


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