zelf een plug-in maken onder delphi

Pagina: 1
Acties:

  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
Ik heb het volgende probleem:
Ik heb een programma dat een array gebruikt van [1..512] waar de waardes 0..255 in kunnen (DMX voor de kenners).
Nu wil ik (het liefst via een DLL) een plug-in maken, zodat andere programma's die array aan kunnen passen (dus andere waardes in deze array kunnen zetten).
Bijv. een DLL met de volgende functies: Setvalue(nr,value:integer) en Getvalue(nr):integer
Setvalue is dan voor het 'vreemde' programma, en getvalue voor het eigen programma.
Heeft iemand hier tips voor?

Hier had uw advertentie kunnen staan!


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Ja.

Antwoord op een vraag die je had kunnen stellen : "Service"

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
En hoe kan ik dit het makkelijkst realizeren?

Hier had uw advertentie kunnen staan!


Verwijderd

Tja..... gebruik gewoon een file hiervoor (text of binair, whatever you like). DLL gebruiken lijkt me een beetje overbodig....

  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
Tja, zou kunnen, alleen bij dmx moet er om de 40ms data beschikbaar staan, dus dan zou het programma om de 40ms die file laden. In dat opzicht lijkt het me beter om het (eventueel) via een dll te doen. (mag ook anders zijn)

Hier had uw advertentie kunnen staan!


  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
Heeft niemand een oplossing?

Hier had uw advertentie kunnen staan!


  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 30-11-2025

WOmBaT

Nyaaa!!!

Je kunt proberen een eigen message te creeeren via het overbekende windows message systeem en de waarden overdragen d.m.v. de LPARAM en WPARAM. Ik denk dat je op delphi.about.com daar wel meer info over klan vinden en anders bij delphi3000.com. Succes

  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
gaat dat snel genoeg?

Hier had uw advertentie kunnen staan!


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 14-09 17:42

Gerco

Professional Newbie

Op donderdag 04 oktober 2001 21:44 schreef hardrocker het volgende:
gaat dat snel genoeg?
Aangezien het systeem enkele honderden window messages per seconde kan sturen is dat inderdaad snel genoeg. Alleen is het niet gegarandeerd dat windowmessages snel aankomen, het kan wel een paar ms te lang duren als het systeem erg druk is.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Voorbeeld
code:
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
43
44
45
46
47
48
49
50
51
52
library DllProject;

uses
  Windows;

{$R *.RES}

const
  FBuffer: PChar = nil;
  FSharedBuffer: THandle = 0;
  CBufferSize = 1024;

procedure SetValue(const ANr, AValue: Integer);
begin
  if (ANr < 0) or (ANr >= CBufferSize) then Exit;
  PByte(FBuffer + ANr)^ := Byte(AValue);
end;

function GetValue(const ANr: Integer): Integer;
begin
  if (ANr >= 0) and (ANr < CBufferSize) then
    Result := PByte(FBuffer + ANr)^
  else
    Result := 0;
end;

exports
  SetValue,
  GetValue;

procedure LibInit;
begin
  FSharedBuffer := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
    CBufferSize, 'HoiHoi');
  FBuffer := MapViewOfFile(FSharedBuffer, FILE_MAP_WRITE, 0, 0, 0);
end;

var
  SaveExit: Pointer;

procedure LibExit;
begin
  UnmapViewOfFile(FBuffer);
  CloseHandle(FSharedBuffer);
  ExitProc := SaveExit; // restore exit procedure chain
end;

begin
  LibInit;
  SaveExit := ExitProc; // bewaar exit procedure chain
  ExitProc := @LibExit; // install LibExit exit procedure
end.

Have fun :)

  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
Bedankt voor de code, ik heb hem uitgeprobeerd met wat dingen aangepast:
code:
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
43
44
45
46
47
48
49
50
51
52
53
library plugin;
uses
  sharemem,
  SysUtils,
  Classes,windows;

{$R *.RES}
const
  FBuffer: PChar = nil;
  FSharedBuffer: THandle = 0;
  CBufferSize = 512;


procedure setchannel(Const ANr, AValue: Integer);
begin
  if (ANr < 0) or (ANr >= CBufferSize) then Exit;
  PByte(FBuffer + ANr)^ := Byte(AValue);
end;

function getchannel(Const ANr: Integer): Integer;
begin
  if (ANr >= 0) and (ANr < CBufferSize) then
    Result := PByte(FBuffer + ANr)^
  else
    Result := 0;
end;

exports
  setchannel,
  getchannel;

procedure LibInit;
begin
  FSharedBuffer := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
    CBufferSize, 'HoiHoi');
  FBuffer := MapViewOfFile(FSharedBuffer, FILE_MAP_WRITE, 0, 0, 0);
end;

var
  SaveExit: Pointer;

procedure LibExit;
begin
  UnmapViewOfFile(FBuffer);
  CloseHandle(FSharedBuffer);
  ExitProc := SaveExit; // restore exit procedure chain
end;

begin
  LibInit;
  SaveExit := ExitProc; // bewaar exit procedure chain
  ExitProc := @LibExit; // install LibExit exit procedure
end.

Om de dll te testen heb ik het volgende programmaatje gemaakt:
code:
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
43
44
45
unit Unit1;

interface

uses
  sharemem, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Spin;

type
  TForm1 = class(TForm)
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    setbtn: TButton;
    getbtn: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure setbtnClick(Sender: TObject);
    procedure getbtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure setchannel(Anr,Avalue:integer); stdcall; external 'plugin.dll';
function getchannel(Anr: integer): integer; stdcall; external 'plugin.dll';

procedure TForm1.setbtnClick(Sender: TObject);
begin
 SetChannel(SpinEdit1.Value,SpinEdit2.Value);
end;

procedure TForm1.getbtnClick(Sender: TObject);
begin
SpinEdit2.Value:=GetChannel(SpinEdit1.Value);
end;

end.

Alleen als ik nu op de set button klik krijg ik de volgende error:
code:
1
Project dlluser.exe raiserd exception class EAccessViolation with message 'Access violation at address 0000002. Read of address 00000002'. Process stopped. Use Step or Run to continue.

Wat doe ik verkeerd?
Owja, ik gebruik windows 2000 (misschien heeft het daar mee te maken?)
Help?

Hier had uw advertentie kunnen staan!


Verwijderd

Probeer effe wat, zoals:
  • ShareMem weghalen, is alleen nodig als je strings gebruikt in dll's
  • StdCall weghalen [<- Dit is volgens mij het probleem]
  • const erbij zetten
Dus zoiets
code:
1
2
function GetChannel(const ANr: Integer): Integer; external 'Plugin.dll';
procedure SetChannel(const ANr, AValue: Integer); external 'Plugin.dll';

  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
Fixed!
stdcall was het probleem.
Echt hartstikke bedankt, dit was precies wat ik bedoelde en nodig had

Hier had uw advertentie kunnen staan!


  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
btw, zou je mij je email adres (of icq) door willen geven (via email of icq)?
Kan wel eens makkelijk zijn, en sneller antwoord
Bvd.

Hier had uw advertentie kunnen staan!


Verwijderd

Op dinsdag 09 oktober 2001 16:58 schreef hardrocker het volgende:
btw, zou je mij je email adres (of icq) door willen geven (via email of icq)?
Kan wel eens makkelijk zijn, en sneller antwoord
Bvd.
Mwoh, daar heb ik eigenlijk niet zo zin in :)

Ik begrijp dat het wel makkelijk voor jou kan zijn, maar ik vind het beantwoorden van vragen via GoT makkelijker; ik kan antwoorden wanneer ik wil en als ik de vraag leuk vind. En anders zijn er zillion andere users die jouw vragen kunnen beantwoorden.

Ik ben trouwens aan het afstuderen en dus bijna continue online [op GoT] en kan dus snel antwoorden op vragen...

Niet lullig bedoeld natuurlijk

  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
Met alle respect voor je privacy, en nogmaals mijn hartelijke dank

Hier had uw advertentie kunnen staan!


  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
maaruh, wat wil dat stdcall dan precies zeggen, en waarom geeft hij daar problemen mee?

Hier had uw advertentie kunnen staan!


  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
(thread omhoog gooien)

Hier had uw advertentie kunnen staan!


Verwijderd

Uit de help:
When you declare a procedure or function, you can specify a calling convention using one of the directives register, pascal, cdecl, stdcall, and safecall.

[..]

Calling conventions determine the order in which parameters are passed to the routine. They also affect the removal of parameters from the stack, the use of registers for passing parameters, and error and exception handling. The default calling convention is register.

[..]

The default register convention is the most efficient, since it usually avoids creation of a stack frame. (Access methods for published properties must use register.) The cdecl convention is useful when you call functions from DLLs written in C or C++, while stdcall and safecall are used for Windows API calls.

[..]
In de dll had je bij de procedure declaratie niets gespecificeerd, dus werd register gebruikt; in de unit waarin je de functies uit de dll gebruikt, wou je ze aanroepen met stdcall; en dat gaat fout zoals je zag.
Pagina: 1