/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Access Violation....jeg kan bare ikke find~
Fra : Thomas Eg Jørgensen


Dato : 25-03-04 13:05

Hej

Jeg har en funktion i en DLL fil som jeg ønsker at anvende. I
dokumentationen er der angivet:

*****
The following send function is provided:

long TPMTECCOMAPIEXPORT __cdecl OpSndRcvCl(
void * psndbuffer, /* Pointer to send buffer */
void **rcvbuffer); /* Pointer to pointer to receive/error buffer */

Function Returns:

0 => OK : *rcvbuffer may bill filled with pointer to recvbuffer
or NULL
!= 0 => Error
psndbuffer / *psndbuffer may be destroyed !!!
*rcvbuffer may be filled with pointer to Error Struct
tta_Error
*****

Det har jeg oversat til:

function OpSndRcvCl(psndbuffer: pointer; rcvbuffer: pointer): longint;
external tpmteccomapi.dll';


Og jeg kalder det med:
var
sendbuf,receivebuf: pchar;
res: longint;
begin
//Her fylder jeg sendbuf med data...
res:=OpSndRcvCl(sendbuf, @receivebuf);
//her ønsker jeg at behandle data som receivebuf nu gerne skulle pege
på...
end;


Men jeg får altid access violation når jeg kalder OpSndRcvCl...Men jeg er
lidt i tvivl om at fejlen skyldes mig der ikke kalder funktionen rigtigt
eller mig der føder funktionen med de forkerte data i sendbuf-variablen...Så
hvis nogen kan se fejl i ovenstående eller bare kan sige at ovenstående er
100% rigtig vil jeg gerne vide det

På forhånd tak!

MVH
Thomas



 
 
David Konrad (25-03-2004)
Kommentar
Fra : David Konrad


Dato : 25-03-04 13:26

"Thomas Eg Jørgensen" <tejo03@kom.auc.dk> wrote in message
news:EVz8c.584$bk2.423@news.get2net.dk...
> Hej
>
> Jeg har en funktion i en DLL fil som jeg ønsker at anvende. I
> dokumentationen er der angivet:
>
> *****
> The following send function is provided:
>
> long TPMTECCOMAPIEXPORT __cdecl OpSndRcvCl(
> void * psndbuffer, /* Pointer to send buffer */
> void **rcvbuffer); /* Pointer to pointer to receive/error buffer */
>
> Function Returns:
>
> 0 => OK : *rcvbuffer may bill filled with pointer to recvbuffer
> or NULL
> != 0 => Error
> psndbuffer / *psndbuffer may be destroyed !!!
> *rcvbuffer may be filled with pointer to Error Struct
> tta_Error
> *****
>
> Det har jeg oversat til:
>
> function OpSndRcvCl(psndbuffer: pointer; rcvbuffer: pointer): longint;
> external tpmteccomapi.dll';
>
>
> Og jeg kalder det med:
> var
> sendbuf,receivebuf: pchar;
> res: longint;
> begin
> //Her fylder jeg sendbuf med data...
> res:=OpSndRcvCl(sendbuf, @receivebuf);
> //her ønsker jeg at behandle data som receivebuf nu gerne skulle pege
> på...
> end;
>
>
> Men jeg får altid access violation når jeg kalder OpSndRcvCl...Men jeg er
> lidt i tvivl om at fejlen skyldes mig der ikke kalder funktionen rigtigt
> eller mig der føder funktionen med de forkerte data i
sendbuf-variablen...Så
> hvis nogen kan se fejl i ovenstående eller bare kan sige at ovenstående er
> 100% rigtig vil jeg gerne vide det

Pointerne, dvs PChar'erne peger jo på ingenting, og derfor kommer der en
accesviolation. Prøv at lade dem pege på et område i hukommelsen :

var
sendbuf,receivebuf: pchar;
res: longint;
begin
//Her fylder jeg sendbuf med data...
getmem(sendbuf,255);
getmem(receivebuf,255);
res:=OpSndRcvCl(sendbuf, @receivebuf);
//her ønsker jeg at behandle data som receivebuf nu gerne skulle pege
...
freemem(...
på...
end;



Thomas Eg Jørgensen (25-03-2004)
Kommentar
Fra : Thomas Eg Jørgensen


Dato : 25-03-04 13:38


"David Konrad" <david_konrad_FJERN_@hotmail.com> wrote in message
news:c3uj4i$hf0$1@sunsite.dk...
> > function OpSndRcvCl(psndbuffer: pointer; rcvbuffer: pointer): longint;
> > external tpmteccomapi.dll';
> > var
> > sendbuf,receivebuf: pchar;
> > res: longint;
> > begin
> > res:=OpSndRcvCl(sendbuf, @receivebuf);
> > end;
> > Men jeg får altid access violation når jeg kalder OpSndRcvCl...Men jeg
er
> > lidt i tvivl om at fejlen skyldes mig der ikke kalder funktionen rigtigt
> > eller mig der føder funktionen med de forkerte data i
> sendbuf-variablen...Så
> > hvis nogen kan se fejl i ovenstående eller bare kan sige at ovenstående
er
> > 100% rigtig vil jeg gerne vide det
>
> Pointerne, dvs PChar'erne peger jo på ingenting, og derfor kommer der en
> accesviolation. Prøv at lade dem pege på et område i hukommelsen :
>
> getmem(sendbuf,255);
> getmem(receivebuf,255);
> res:=OpSndRcvCl(sendbuf, @receivebuf);

Well, sendbuf fylder jeg op med:
strpcopy(MinStreng, sendbuf);
så den burde vel være ok?

Og Receivebuf sender jeg jo som @Receivebuf til funktionen så jeg gik
sådanset ud fra at den importerede funktion ville ændre addressen på
pointeren til at pege på de returnerede data. Derfor burde det ikke være
nødvendigt at allokere plads til den, eller?

Jeg prøvede naturligvis alligevel, men der kommer stadig access violation

Den access violation opstår også i den importerede DLL-fil:
"Access violation at address 100030F4 in module 'tpmteccomapi.dll'. Read of
address 00C78000."
Har det nogen betydning?

MVH
Thomas



David Konrad (25-03-2004)
Kommentar
Fra : David Konrad


Dato : 25-03-04 15:37

"Thomas Eg Jørgensen" <tejo03@kom.auc.dk> wrote in message
news:loA8c.638$E93.217@news.get2net.dk...
>
> > Pointerne, dvs PChar'erne peger jo på ingenting, og derfor kommer der en
> > accesviolation. Prøv at lade dem pege på et område i hukommelsen :
> >
> > getmem(sendbuf,255);
> > getmem(receivebuf,255);
> > res:=OpSndRcvCl(sendbuf, @receivebuf);
>
> Well, sendbuf fylder jeg op med:
> strpcopy(MinStreng, sendbuf);
> så den burde vel være ok?

OK - det så jeg ikke.

> Og Receivebuf sender jeg jo som @Receivebuf til funktionen så jeg gik
> sådanset ud fra at den importerede funktion ville ændre addressen på
> pointeren til at pege på de returnerede data. Derfor burde det ikke være
> nødvendigt at allokere plads til den, eller?

Det mener jeg som udgangspunkt man skal forvente. Det er f.eks gennemgående
i windows API'et, at man skal allokere plads i de variable som funktionerne
skal kopiere data over i - typisk skal man endda angive hvor meget plads der
er til rådighed. Det er ikke API'ets opgave at instantiere objekter, oprette
pointere etc.

> Jeg prøvede naturligvis alligevel, men der kommer stadig access
violation
>
> Den access violation opstår også i den importerede DLL-fil:
> "Access violation at address 100030F4 in module 'tpmteccomapi.dll'. Read
of
> address 00C78000."
> Har det nogen betydning?

Det er svært at vide. Jeg tænker på, om du har husket at tage forbehold for
kaldekonventionen __cdecl ? Den instruerer den kaldende kode om, i hvilken
rækkefølge parametrene overføres og hvis ansvar det er at rydde op. Jeg
påstår ikke det har nogen betydning lige i det tilofælde overhovedet, men
prøv alligevel med

function OpSndRcvCl(psndbuffer: pointer; rcvbuffer: pointer): longint;
external tpmteccomapi.dll'; cdecl;

????



Thomas Eg Jørgensen (25-03-2004)
Kommentar
Fra : Thomas Eg Jørgensen


Dato : 25-03-04 15:45


"David Konrad" <david_konrad_FJERN_@hotmail.com> wrote in message
news:c3uqr0$gfo$1@sunsite.dk...
> > Den access violation opstår også i den importerede DLL-fil:
> > "Access violation at address 100030F4 in module 'tpmteccomapi.dll'. Read
> of
> > address 00C78000."
> > Har det nogen betydning?
>
> Det er svært at vide. Jeg tænker på, om du har husket at tage forbehold
for
> kaldekonventionen __cdecl ? Den instruerer den kaldende kode om, i hvilken
> rækkefølge parametrene overføres og hvis ansvar det er at rydde op. Jeg
> påstår ikke det har nogen betydning lige i det tilofælde overhovedet, men
> prøv alligevel med
>
> function OpSndRcvCl(psndbuffer: pointer; rcvbuffer: pointer): longint;
> external tpmteccomapi.dll'; cdecl;
>

Jeg ændrede det til:
function OpSndRcvCl(psndbuffer: pointer; rcvbuffer: pointer): longint;
cdecl; external 'tpmteccomapi.dll';

Men det gør ingen forskel...?

Jeg kan se i hjælpefilerne at cdecl konventionen skal anvendes når dll'en er
lavet i C....så den må jeg hellere beholde...

MVH
Thomas



David Konrad (27-03-2004)
Kommentar
Fra : David Konrad


Dato : 27-03-04 01:04

"Thomas Eg Jørgensen" <tejo03@kom.auc.dk> wrote in message
news:DfC8c.704$EY5.666@news.get2net.dk...
>
> Jeg ændrede det til:
> function OpSndRcvCl(psndbuffer: pointer; rcvbuffer: pointer): longint;
> cdecl; external 'tpmteccomapi.dll';
>
> Men det gør ingen forskel...?

Du må gerne sende mig DLL'en - eller sige hvad den hedder, hvis den tilhører
ét eller andet offentligt tilgængeligt library - og hvis du altså ikke fik
det til at virke med Nicolai Hansens forslag med PPointere...?



Thomas Eg Jørgensen (27-03-2004)
Kommentar
Fra : Thomas Eg Jørgensen


Dato : 27-03-04 09:24


"David Konrad" <david_konrad_FJERN_@hotmail.com> wrote in message
news:c42gde$asp$1@sunsite.dk...
> > Jeg ændrede det til:
> > function OpSndRcvCl(psndbuffer: pointer; rcvbuffer: pointer): longint;
> > cdecl; external 'tpmteccomapi.dll';
> >
> > Men det gør ingen forskel...?
>
> Du må gerne sende mig DLL'en - eller sige hvad den hedder, hvis den
tilhører
> ét eller andet offentligt tilgængeligt library - og hvis du altså ikke fik
> det til at virke med Nicolai Hansens forslag med PPointere...?
>

Mange tak for tilbudet! Jeg fandt løsningen på problemet, det viste sig at
være en fejl der var placeret cirka 40cm fra skærmen

De første 4 bytes i sendbufferen bruges til at angive længden af bufferen og
når jeg stykkede bufferen sammen gjorde jeg det "manuelt" så bufferen blev
samlet med MSB først i stedet for LSB. Længden af bufferen angav jeg derfor
til 00 00 01 11 og ikke 11 01 00 00. Efter jeg droppede slamkodningen og
brugte en TMemoryStream i stedet blev problemet løst...

....Så kan jeg lære det

MVH
Thomas



Nicolai Hansen (26-03-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 26-03-04 11:02

> long TPMTECCOMAPIEXPORT __cdecl OpSndRcvCl(
> void * psndbuffer, /* Pointer to send buffer */
> void **rcvbuffer); /* Pointer to pointer to receive/error buffer */

"pointer to pointer".

> Det har jeg oversat til:
>
> function OpSndRcvCl(psndbuffer: pointer; rcvbuffer: pointer): longint;
> external tpmteccomapi.dll';

type PPointer=^pointer;
function OpSndRcvCl(psndbuffer: pointer; rcvbuffer: PPointer): longint;

eller

function OpSndRcvCl(psndbuffer: pointer; var rcvbuffer: pointer): longint;

burde gøre det. Sidste er nok nemmest.

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409080
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste