[ Burgos @ 26.04.2005. 21:37 ] @
Kao prvo, zeleo bih da zahvalim svima - uspeo sam da prevedem sve headere na delphi (mozda mi nisu negde dobro definisani tipovi, ali nije veliki problem)

Sada pokrećem aplikaciju i pozivam Dll.

u C++su definicija funckije glasi:

Code:
__stdcall int StartSDK(int pVersion, int Option);


na delphi sam preveo

Code:
function StartSDK(pVersion: Integer; Option: Integer): Integer; stdcall;


Undefined reference sam resio
Code:
function StartSDK;external 'DLL.dll' name 'StartSDK';


I kada pozovem funckiju ona vrati vrednost, ali odmah potom program zakuca

Code:
MessageDlg(IntToHex(RCStartSDK(2, 0), 5), mtInformation, [mbOk], 1);


Citat:
Access Violation...


U attachmentu je uproscena verzija
[ Srki_82 @ 26.04.2005. 21:53 ] @
Problem je bio sto DLL zahteva pointer na onu strukturu u koju treba da ti vrati podatke. Pogledaj kako sam to resio.
Nadam se da je to ono sto ti treba

-Edit-

Nesto me zeza Wierless pa ne mogu da uploadujem kod, ali evo ovako
Code:
unit Unit1;

interface

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

type

cdVersionInfo =  record
    Size: SmallInt ;                    // Size of this structure */
  MajorVersion:    SmallInt;        // Major version number. */
    MinorVersion: SmallInt        ;      // Minor version number. */
    ReleaseVersion: SmallInt        ;    // Release versionn number. 0 means unknown.*/
    chVersion: array[0..32] of Char;    // String of version number.  e.x "1.0.0.1" */
end;
pV = ^cdVersionInfo;

function RCStartSDK(pVersionInfo: pV; Option: Integer): SmallInt; stdcall; external 'RCSDK.dll' name 'RCStartSDK';

type
  TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
 pVara: cdVersionInfo;
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
  MessageDlg(IntToStr(RCStartSDK(@pVara, 0)), mtInformation, [mbOk], 1);
end;

end.


[Ovu poruku je menjao Srki_82 dana 26.04.2005. u 23:10 GMT+1]
[ Burgos @ 26.04.2005. 22:07 ] @
To je to Srki!

Hvala mnogo!!!!!!!!!!!!
[ Srki_82 @ 26.04.2005. 22:20 ] @
Da li mozemo da vidimo program kad ga zavrsis? Mozda ces ga postovati na www.srpskisoftware.cjb.net ?
[ Burgos @ 27.04.2005. 10:54 ] @
Naravno da možete!

Samo, to nije program :)

Prevodim funkcije iz Canonovog RCSDK (‘Remote API Camera Software Development Kit’.) u Delphi.

Nego, našao sam još jedan način da proradi (meni je lepši, nema pointera)

Code:
function RCStartSDK(var pVersionInfo: cdVersion info; Option: Integer): SmallInt; stdcall; external 'RCSDK.dll' name 'RCStartSDK';


Kao što vidite ubacio sam var i radi.

Inače, sasvim slučajno sam ubacio var :), pa možete li mi pojasniti razliku?
[ _v!rus_ @ 27.04.2005. 12:46 ] @
Zasto koristiti adresiranje (@ i ^) ako se bas ne mora, u principu takve stvari se i rade sa var.

Najprostije, var oznacava prosledjivanje parametara PO REFERENCI, a bez var je PO VREDNOSTI. Znaci kada stavis var ti ustvari prosledjujes referencu na promenljivu, tj. pointer, a bez var pravis kopiju vrednosti koju prosledjujes. Ali samo da znas, sve prosledjivanje klasa je implicitno po referenci, iako nigde nema var...
[ Burgos @ 27.04.2005. 13:02 ] @
Sada mi je jasno :)

Kao u VB: ByVal, ByRef

Hvala mnogo!