Avatar billede mora Nybegynder
20. januar 2002 - 18:29 Der er 19 kommentarer og
1 løsning

dll kald

Jeg har en funktion i en standard wimdows dll fil, hvordan kan jeg bruge resultatet af denne i en anden unit ?


library network;

uses
  SysUtils,
  windows,
  ExtCtrls;

function GetTotalInd(Data : PChar) : Integer;export;
begin
result:=2;
end;

exports GetTotalInd;

end.




___
Løsningen skal helst udføres uden ekstra units, hvis det er muligt :)
Avatar billede cms Nybegynder
20. januar 2002 - 19:12 #1
vha. statisk binding skriver du i det Unit du vil bruge funktionen:

function GetTotalInd(Data: PChar): Integer; external \'network.dll\';

Du kan nu kalde denne funktion somom den stod i dit unit...
Avatar billede mora Nybegynder
20. januar 2002 - 19:35 #2
Har du et eks. på hvor det skal være ?

da, jeg skal bruge det i et bersirc script...


unit Netstat;

uses Extras, Events, Menus;

Procedure F5(Flags: String);
begin
  if Flags = \'\' then
  Say(\'VIRKER\'+IntToStr(GetTotalInd));
end;

end.



hvor skal den være :?
function GetTotalInd(Data: PChar): Integer; external \'network.dll\';
Avatar billede cms Nybegynder
20. januar 2002 - 19:45 #3
unit Netstat;

uses Extras, Events, Menus;

function GetTotalInd(Data: PChar): Integer; external \'network.dll\';

Procedure F5(Flags: String);
begin
  if Flags = \'\' then
  Say(\'VIRKER\'+IntToStr(GetTotalInd));
end;

end.
Avatar billede mora Nybegynder
20. januar 2002 - 19:51 #4
* Script Error in unit \'Netstat\' on line 5 : \'name\' or \'index\' expected but \';\' found

:-(
Avatar billede cms Nybegynder
20. januar 2002 - 19:54 #5
Nu er det jo et script du snakker om, så jeg kan jo ikke garantere at det opfører sig på samme måde som delphi.
Hvor på linje 5 melder den om problemer? Lige ved external?
Avatar billede stoney Nybegynder
20. januar 2002 - 20:04 #6
Prøv at ændre function GetTotalInd(Data: PChar): Integer; external \'network.dll\';
til en af nedenstående.

------------------------------------------
function GetTotalInd(Data: PChar): Integer; external \'network.dll\' name \'gettotalind\';
-------------------------------------------
function GetTotalInd(Data: PChar): Integer;stdcall; external \'network.dll\' name \'gettotalind\';
-------------------------------------------

Stoney
Avatar billede mora Nybegynder
20. januar 2002 - 20:40 #7
Naa, ved godt det er lidt anderledes :/, os derfor jeg bare gav dig points :-P

* Script Error in unit \'Netstat\' on line 11 : Can\'t get proc address for function \'\'

Nogen ide hvad det kan være ?

bersirc script
unit Netstat;

uses Extras, Events, Menus;

function GetTotalInd(Data: PChar): Integer; external \'network.dll\' name \'gettotalind\';

Procedure F5(Flags: String);
begin
  if Flags = \'\' then
  Say(\'VIRKER\');
  GetTotalInd(\':\');
end;

end.


___ min dll___
library network;

uses
  SysUtils,
  windows,
  Iprtrmib,
  IpFunctions,
  ExtCtrls;

function GetTotalInd() : Integer;export;
var
  Stats: TMibIpStats;
begin
  VVGetIpStatistics(Stats);
  with Stats do
  begin
result:=dwInDelivers div 1024;
  end;
end;

function GetTotalUd() : Integer;export;
var
  Stats: TMibIpStats;
begin
  VVGetIpStatistics(Stats);
  with Stats do
  begin
  result:=dwOutRequests div 1024;
  end;
end;

exports GetTotalInd, GetTotalUd;

end.
Avatar billede stoney Nybegynder
20. januar 2002 - 20:46 #8
Procedure F5(Flags: String);
begin
  if Flags = \'\' then
  Say(\'VIRKER\');
  GetTotalInd(\':\');  <--- Er der ikke noget galt her
end;
Avatar billede mora Nybegynder
20. januar 2002 - 20:48 #9
Nææ, den skal jo havde data:PChar ?

bruger ikke den data til noget men derfor skal det med i kaldet anyway, ik :) ?
Avatar billede stoney Nybegynder
20. januar 2002 - 20:57 #10
Prøv at bruge løsning 2 fra mit første indlæg

Den med stdcall

Det virker som om du ikke får \"callback\"

Stoney
Avatar billede mora Nybegynder
20. januar 2002 - 20:59 #11
har prøvet, så giver den slet ikke noget :)
heller ikke say virker :)
Avatar billede stoney Nybegynder
20. januar 2002 - 21:03 #12
Jeg forstår stadig ikke nedenstående.
GetTotalInd returnere en integer, men hvad er integer af \':\'

Procedure F5(Flags: String);
begin
  if Flags = \'\' then
  Say(\'VIRKER\');
  GetTotalInd(\':\');  <--- Er der ikke noget galt her
end;

Stoney
Avatar billede mora Nybegynder
20. januar 2002 - 21:11 #13
GetTotalInd var oprindeligt lavet til mIRC hvor der skal være en data:pchar i dens call ...

function GetTotalInd() : Integer;export;
var
  Stats: TMibIpStats;
begin
  VVGetIpStatistics(Stats);
  with Stats do
  begin
result:=dwInDelivers div 1024;
  end;
end;


Funktionen bruger intet sted \"data\", iøvrigt er den version der ligger i dllen, med data:pchar som argument ...
Avatar billede cms Nybegynder
20. januar 2002 - 21:16 #14
Mit bedste forslag må være at du snakker med dem, der har lavet script-sproget. Evt. finder et diskussions-forum til formålet.
Avatar billede stoney Nybegynder
20. januar 2002 - 21:24 #15
Procedure F5(Flags: String);
begin
  if Flags = \'\' then
  Say(\'VIRKER\');
  GetTotalInd(\':\'); 
end;
---------------------------------

Dit if statement udfører kun GetTotalInd(\':\');

I nedenstående tumpe eks. er det kun label2 der ændrer sig.

procedure TForm1.Button4Click(Sender: TObject);
begin
if edit1.Text = \'edit1\' then
label1.caption := \'ib\';
label2.caption := \'helge\';
end;

Stoney
Avatar billede mora Nybegynder
20. januar 2002 - 21:26 #16
med denne
Procedure F5(Flags: String);
begin
  Say(\'VIRKER\');
  GetTotalInd(\':\');
end;

retuner den
<_MORA> VIRKER
* Script Error in unit \'Netstat\' on line 11 : Can\'t get proc address for function \'\'
Avatar billede stoney Nybegynder
20. januar 2002 - 21:28 #17
Ja, men der er ikke If .... Then

Stoney
Avatar billede stoney Nybegynder
20. januar 2002 - 21:32 #18
Prøv nedenstående

Procedure F5(Flags: String);
begin
  if Flags = \'\' then
  Say(\'VIRKER\');
begin
Say(\'VIRKER\');
  GetTotalInd(\':\'); 
end;
end;

Stoney
Avatar billede razersedge Nybegynder
20. januar 2002 - 21:53 #19
skal du kalde dllen fra irc ?? for så skal du lav din irc dll lidt anderledes:

her er et eksempel som jeg fandt her på eksperten, det indeholder nogle funktioner, dem kan du bare slette

library irc_dll;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library\'s USES clause AND your project\'s (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  classes,
  windows,
  dialogs,
  registry;

var
  param: Tstringlist;

procedure Tokenize(text: string; token: char);
var
  temp1,temp2: string;
begin
  try
    param.free;
  except
  end;
  param:=Tstringlist.create;
  temp1:=text;
  while (Length(temp1) > 0) and (pos(token,temp1)>0) do begin
      temp2:=temp1;
      temp1 := Copy(temp1, 0, pos(token,temp1)-1);
      param.Add(temp1);
      temp1 := copy(temp2,pos(token,temp2)+1,length(temp2));
  end;
  param.Add(temp1);
end;

function ETA( mWnd:
      hWnd; aWnd: hWnd; Data: PChar; Parms: PChar; Show: Boolean; NoPause:
      Boolean ): Integer;export;stdcall;
begin
  strcopy(data, \'The search for E.T. will never end!\');
  result:=3;
end;

function RegRead( mWnd:
      hWnd; aWnd: hWnd; Data: PChar; Parms: PChar; Show: Boolean; NoPause:
      Boolean ): Integer;export;stdcall;
var
  mam: pchar;
  reg: Tregistry;
  key: Hkey;
begin
  try
    tokenize(data,\'|\');
    reg:=Tregistry.create;
    if param[0]=\'HKEY_LOCAL_MACHINE\' then
      Key:=HKEY_LOCAL_MACHINE;
    if param[0]=\'HKEY_CLASSES_ROOT\' then
      Key:=HKEY_CLASSES_ROOT;
    if param[0]=\'HKEY_CURRENT_USER\' then
      Key:=HKEY_CURRENT_USER;
    if param[0]=\'HKEY_USERS\' then
      Key:=HKEY_USERS;
    if param[0]=\'HKEY_CURRENT_CONFIG\' then
      Key:=HKEY_CURRENT_CONFIG;
    if param[0]=\'HKEY_DYN_DATA\' then
      Key:=HKEY_DYN_DATA;
    if (param[0] <> \'HKEY_CLASSES_ROOT\') and (param[0] <> \'HKEY_LOCAL_MACHINE\') and
    (param[0] <> \'HKEY_CURRENT_USER\') and (param[0] <> \'HKEY_USERS\') and
    (param[0] <> \'HKEY_CURRENT_Config\') and (param[0] <> \'HKEY_DYN_DATA\') then begin
      Raise Tregistry.create;
    end;
    reg.RootKey:=key;
    reg.OpenKey(param[1],true);
    strcopy(data,pchar(reg.ReadString(param[2])));
    reg.free;
    result:=3;
  except
  /test3 /echo

/test4 /dll mIRC_DLL.dll RegWrite HKEY_LOCAL_MACHINE|software\\SGUFT Software\\Contact|Skidern|MAM!!

    strcopy(data,\'/echo SGUFT_DLL >> 4Failed to read from the registrydatabase! Syntax: $dll(sguft.dll,RegRead, HKEY_LOCAL_MACHINE|software\\SGUFT Software\\Contact|rname)\');
    strcopy(parms, \'-s\');
    result:=2;
  end;
end;

function RegWrite( mWnd:
      hWnd; aWnd: hWnd; Data: PChar; Parms: PChar; Show: Boolean; NoPause:
      Boolean ): Integer;export;stdcall;
var
  mam: pchar;
  reg: Tregistry;
  key: Hkey;
begin
  try
    tokenize(data,\'|\');
    reg:=Tregistry.create;
    if param[0]=\'HKEY_LOCAL_MACHINE\' then
      Key:=HKEY_LOCAL_MACHINE;
    if param[0]=\'HKEY_CLASSES_ROOT\' then
      Key:=HKEY_CLASSES_ROOT;
    if param[0]=\'HKEY_CURRENT_USER\' then
      Key:=HKEY_CURRENT_USER;
    if param[0]=\'HKEY_USERS\' then
      Key:=HKEY_USERS;
    if param[0]=\'HKEY_CURRENT_CONFIG\' then
      Key:=HKEY_CURRENT_CONFIG;
    if param[0]=\'HKEY_DYN_DATA\' then
      Key:=HKEY_DYN_DATA;
    reg.RootKey:=key;
    reg.OpenKey(param[1],true);
    reg.writeString(param[2],param[3]);
    reg.free;
    strcopy(data,\'/echo SGUFT_DLL >> 3Info was successfully written to the registrydatabase!\');
    strcopy(parms, \'-s\');
    result:=2;
  except
    strcopy(data,\'/echo SGUFT_DLL >> 4Failed to write to the registrydatabase!\');
    strcopy(parms, \'-s\');
    result:=2;
  end;
end;

function ETB( mWnd:
      hWnd; aWnd: hWnd; Data: PChar; Parms: PChar; Show: Boolean; NoPause:
      Boolean ): Integer;export;stdcall;
var
  mam: pchar;
begin
  strcopy(mam,pchar( Inputbox(\'Inputbox\',\'Enter somekind of Input?\',\'\')));
  strcopy(data, pchar(\'/echo The search for E.T. will never end! | /echo er det mam ? | /echo \'+mam));
  strcopy(parms, \'-a\');
  result:=2;
end;

exports ETA, ETB, RegRead, RegWrite;

end.



###########################3


derefter kan du kalde dllen fra irc ved brug af denne kommando:

$dll(dllnavn+.dll,dllfunktion,_)

Avatar billede mora Nybegynder
20. januar 2002 - 23:21 #20
IRC - ja
mIRC - nej

:-)

Det er et bersirc script, ellers tak :P
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester