Ok ik heb het volgende stukje Delphi code. In dit stukje gebruiken ze een DLL die ik moet implementeren in C#. Het probleem is dat ik in C# die handler niet goed krijg.
Eerst het stukje Delphi code
Benodigde declaraties
De Functie
Het betref the DLL functie JL_GetImage. Deze functie geef je de naam van de image mee zoals "pietje" , status string en een buffer size. Deze geeft dan een Handler terug voor een image.
Mijn conversie tot zo ver naar C#
Zover ik weet in conversie is dat een THANDLE in Delphi in C# een long is. Als die een long is geeft hij ook een groot getal terug. Dit getal bij de laatste keer dat ik het startte : 16325552944185344
Als ik ipv een long IntPtr neer zet krijg ik 0 terug. Dit mede denk ik omdat het getal te groot is . Kan hij niet omzetten en dus geeft hij 0 terug.
Mijn vraag ik hoe moet ik het zo krijgen dat ik deze handler ook daadwerkelijk kan gebruiken in C#
Ik heb me blauw gezocht met google maar heb daar ook niets kunnen vinden. Alle voorbeeld die dan over DLL's gaan geven zoals het moet een Handler terug als integer en niet als long
Eerst het stukje Delphi code
Benodigde declaraties
Delphi:
1
2
3
4
5
6
| const DLLNAME = 'JL_VisionLib_DLL.dll'; function JL_Execute (cmd: PChar; answer: PChar; maxSizeAnswer: integer): integer; cdecl; external DLLNAME; function JL_GetImage (imageName: PChar; answer: PChar; maxSizeAnswer: integer): THANDLE; cdecl; external DLLNAME; function JL_SetImage (imageName: PChar; imagetype: PChar; bmpH : THandle; answer: PChar; maxSizeAnswer: integer): integer; cdecl; external DLLNAME; function JL_GetBufPtr(imageName: PChar; answer: PChar; maxSizeAnswer: integer): Pointer; cdecl; external DLLNAME; |
De Functie
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| function GetImage (imageName: string; bmp: TBitmap): string; var h : THANDLE; charBuffer : PChar; begin GetMem (charBuffer, BUFSIZE); h := JL_GetImage (PChar(imageName), charBuffer, BUFSIZE); result := RemoveTimeMsg(charBuffer); if (h <> 0) then begin if (not bmp.Empty) then bmp.FreeImage; bmp.Handle := h; bmp.Dormant; bmp.FreeImage; end; FreeMem (charBuffer, BUFSIZE); end; |
Het betref the DLL functie JL_GetImage. Deze functie geef je de naam van de image mee zoals "pietje" , status string en een buffer size. Deze geeft dan een Handler terug voor een image.
Mijn conversie tot zo ver naar C#
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| using System; using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; using System.Drawing.Imaging; using System.Drawing; using System.Windows.Forms; namespace Lengtemetingen { public class doDLL { [DllImport("JL_VisionLib_DLL.dll",CallingConvention = CallingConvention.Cdecl,CharSet = CharSet.Ansi)] public static extern long JL_GetImage(string imageName,string answer , int maxSizeAnswer); } public class Connection { string sendstatus = ""; const int BUFFSIZE = 1024; public Connection(GUI gui) { try { long test = doDLL.JL_GetImage("lut",sendstatus,BUFFSIZE); Console.WriteLine(test.ToString()); } catch(System.DllNotFoundException dnfe) { gui.setStatus(dnfe.Message); } catch(System.Exception exp) { Console.WriteLine(exp.Message); } } } } |
Zover ik weet in conversie is dat een THANDLE in Delphi in C# een long is. Als die een long is geeft hij ook een groot getal terug. Dit getal bij de laatste keer dat ik het startte : 16325552944185344
Als ik ipv een long IntPtr neer zet krijg ik 0 terug. Dit mede denk ik omdat het getal te groot is . Kan hij niet omzetten en dus geeft hij 0 terug.
Mijn vraag ik hoe moet ik het zo krijgen dat ik deze handler ook daadwerkelijk kan gebruiken in C#
Ik heb me blauw gezocht met google maar heb daar ook niets kunnen vinden. Alle voorbeeld die dan over DLL's gaan geven zoals het moet een Handler terug als integer en niet als long