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:
das Marshal-Konzept (oder was auch immer sich dahinter verbirgt)
Einbinden von externen Prozeduren mit Parameterübergabe (speziell die Übergabe von Speicherbereichen)
Allgemeine Unterschiede beim Programmieren in Delphi .Net
Ich habe es langsam satt immer nur rumzustochern.
Für jeden Rat/Hinweis/Url/Buch/Lebensweisheit wäre ich unendlich dankbar
Michael
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!