[OSRS-PROJ] delphi API Conversion for proj.dll

邵今 bornkilled at 21cn.com
Sun Jul 21 20:21:18 PDT 2002


hi, I found the problem ,I should use "cdecl" but not "stdcall"
then everything is ok
thanks everybody

bornkilled at 21cn.com

-----------------------------------------------------------------
Re: [OSRS-PROJ] delphi API Conversion for proj.dll


To: osrs-proj at remotesensing.org, <osrs-proj at remotesensing.org>
Subject: Re: [OSRS-PROJ] delphi API Conversion for proj.dll
From: Mike Schmidt <mike at sepia.com>
Date: Thu, 11 Jul 2002 10:40:44 -0400
In-Reply-To: <000a01c228b4$3249b1f0$0400a8c0 at shaojin>
Reply-To: osrs-proj at remotesensing.org
Sender: owner-osrs-proj at remotesensing.org
I use proj from both VC++ and VB. I don't know Delphi very well, but I have a few suggestions:

1. pj_errno is a variable, not a function. Calling it as a function will cause you to crash with an access violation.

2. There is no need to know the contents of PJ*, you should use it simply as an opaque pointer. Then there is no problem calling PJ_free. 

3. I can't really comment on the stack overflow in the situation you show. All I can say is that I have not seen this problem myself.

BTW, You don't need definitions of UV and LP for anything.

At 04:23 PM 11/07/2002 +0800, bornkilled wrote:

hi, I want to make a delphi API Conversion for proj.dll( I have compile it by VC6)

 
I wrote pas in this way
unit proj_dll;
 
interface
uses
 windows;
const
 ProjDll='proj.dll';
type
 projPJ=Pointer;
 XY=record
   X:Double;
   Y:Double;
 end;
 UV=XY;
 LP=XY;
 function pj_init(argc:DWord;argv:PLPSTR):projPJ;stdcall;
 function pj_init_plus(definition:PChar):projPJ;stdcall;
 procedure pj_free(var P:projPJ);stdcall;
 procedure pj_deallocate_grids();stdcall;
 function pj_errno():DWORD;stdcall;
 function pj_fwd(aLP:LP;P:projPJ):XY;stdcall;
 function pj_inv(aXY:LP;P:projPJ):LP;stdcall;
 function pj_is_latlong(P:projPJ):DWORD;stdcall;
implementation
 function pj_init;external ProjDll Name 'pj_init';
 function pj_init_plus;external ProjDll Name 'pj_init_plus';
 procedure pj_free;external ProjDll Name 'pj_free';
 procedure pj_deallocate_grids();external ProjDll Name 'pj_deallocate_grids';
 function pj_errno;external ProjDll Name 'pj_errno';
 function pj_fwd;external ProjDll Name 'pj_fwd';
 function pj_inv;external ProjDll Name 'pj_inv';
 function pj_is_latlong ;external ProjDll Name 'pj_is_latlong';
 
But I meet some trouble :
 
1:pj_errno make an exception "Access Violation" in any case;
 
2:I can not find the excatly definition of PJ*,so i can not use pj_free(),that will cause a memory leak .
 
3:pj_fwd will raise stack overflow in the case of the code below:
procedure TForm2.Button1Click(Sender: TObject);
var
 P:projPJ;
 errorno:Integer;
 temp:XY;
 temp1:XY;
 nu:Cardinal;
 i:Integer;
begin
 P:=pj_init_plus(PChar(' +proj=utm +zone=11 +ellps=WGS84));
 i:=pj_errno;
 temp.X:=0;temp.Y:=0;
 nu:=GetTickCount;
 for i:=0 to 50000 do
   temp1:=pj_inv(temp,P);
 ShowMessage(IntToStr(GetTickCount-nu));
end;
 
 
if i<40000 there is no problem
 
 
Bornkilled at 21cn.com
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/proj/attachments/20020722/18e3d714/attachment.html>


More information about the Proj mailing list