Entwickler-Ecke

Andere .NET-Sprachen - Inkompatible Typen: 'Pointer' und 'IntPtr'


Michael R - Mi 26.05.04 23:00
Titel: Inkompatible Typen: 'Pointer' und 'IntPtr'
Hallo allerseits

Ich versuche gerade die RAPI.PAS unter Delphi 8 zum laufen zu bringen. Ich habe alle bisherigen Fehlermeldung wie z.B. "Ich mag Pointer nicht" mit {$UNSAFECODE ON} oder "Ich kenne Type PDWORD nicht" mit PDWORD = ^DWORD zum Schweigen gebracht. Einzig beim folgenden Codeschnipsel versagt mein Delphilatein.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
1 type 
2   TCeRapiInit = function : LongInt stdcall;
3
4  var
5    mCeRapiInit : TCeRapiInit;
6
7  begin
8    RapiModule := LoadLibrary('RAPI.DLL');
9    @mCeRapiInit := GetProcAddress(RapiModule, 'CeRapiInit');
10 end;

Die erzeugt die Fehlermeldung

Quelltext
1:
[Fehler] beispiel(9):  Inkompatible Typen: 'Pointer' und 'IntPtr'                    


:? Die Delphihilfe ist nicht wirklich hilfreich da ich ja nicht versuche einen Double in einen Integer zu quetschen sondern ich gerne die Einsprungadresse der Funktion zuweisen möchte. Wie kann ich dieses Problem umschiffen :?: Oder hat gar jemand schon die Rapi-funktionalität für Delphi 8 angepasst :?:

Ich habe vorher Delphi 5 verwendet und da ergaben diese Anweisungen keine Probleme.

Schon mal Dank an Alle die sich meines Problems annehmen
Michael <-Dies ist wirklich mein Vorname ;-)


AndyB - Mi 26.05.04 23:35

Ein IntPtr ist unter 32Bit Prozessoren ein 32 Bit Zeiger. Du könntest also alle Pointer als IntPtr deklarieren.
Das @ kannst du in diesem Fall auch getrost weg lassen.


Michael R - Sa 29.05.04 02:43
Titel: Ein Problem gelöst - ein Neues da
Ich habe jetzt eine andere Art verwendet um die dll-Aufrufe einzubinden

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
unit rapi;
uses System.Runtime.InteropServices; 
...
[DllImport('RAPI.DLL', CharSet = CharSet.Unicode, SetLastError = True, EntryPoint = 'CeRapiInit')]
function CeRapiInit:LongInt; external;
...

Soweit so gut.
Allerdings wie es meisten so ist habe ich jetzt ein anderes Problem. Die Funktion

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
unit rapi;
{$UNSAFECODE ON}
...
type
  PSecurityAttributes = ^TSecurityAttributes;
  PSTARTUPINFO =^STARTUPINFO;
  PProcessInformation = ^TProcessInformation;

[DllImport('RAPI.DLL', CharSet = CharSet.Unicode, SetLastError = True, EntryPoint = 'CeCreateProcess')]
function
  CeCreateProcess(
    lpApplicationName:string;
    lpCommandLine:LPCWSTR;
    lpProcessAttributes:PSecurityAttributes;
    lpThreadAttributes:PSecurityAttributes;
    bInheritHandles :BOOL;
    dwCreateFlags :DWORD;
    lpEnvironment:Pointer;
    lpCurrentDirectory :LPWSTR;
    lpStartupInfo:PSTARTUPINFO;
    lpProcessInformation:PProcessInformation
  ):BOOL ;UNSAFE;external;

ergibt wenn ich sie wie folgt aufrufe

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
unit aufrufende;
...
procedure aufruf;
begin
  if CeRapiInit=0 then
  begin  
    CeCreateProcess('\Windows\calc.exe',nil,nil,nil,false,0,nil,nil,nil,nil);
    CeRapiUnInit;
  end;
end;

immer

Quelltext
1:
2:
parameter #9 kann nicht gemarshallt werden: Zeiger können nicht auf gemarshallte Strukturen verweisen.
Verwenden Sie stattdessen byref.

Laut Microsoft Windows CE .NET 4.2 CeCreateProcess (RAPI) [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceactsy/html/cerefCeCreateProcessRAPI.asp] soll der Parameter #9 (lpStartupInfo) da er 'Not supported' ist null (also nil in Delphi) sein.

:eyecrazy: Was mache ich also falsch :?: :crying:

Kann mir vielleicht mal jemand URLs oder Bücher nennen die folgende Themen behandeln:

Ich habe es langsam satt immer nur rumzustochern.

Für jeden Rat/Hinweis/Url/Buch/Lebensweisheit wäre ich unendlich dankbar
Michael