Autor Beitrag
Michael R
Hält's aus hier
Beiträge: 4

WIN XP, WIN 2000
D5, D8 Professional
BeitragVerfasst: Mi 26.05.04 23:00 
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.

ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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.

_________________
Ist Zeit wirklich Geld?
Michael R Threadstarter
Hält's aus hier
Beiträge: 4

WIN XP, WIN 2000
D5, D8 Professional
BeitragVerfasst: 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
ausblenden 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
ausblenden 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
ausblenden 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
ausblenden 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) 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