Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Marzo 20, 2012, 09:00:42 am

Titolo: Utilizzo di "nwcalls"
Inserito da: bonmario - Marzo 20, 2012, 09:00:42 am
Ciao a tutti,
dovrei fare un programma che mi permette di capire chi sta allocando un file in una rete Novell.
Ho fatto un po' di ricerche in giro ed ho capito che dovrei usare alcune finzioni dichiarate nel sorgente "nwcalls .pas" che si trova in "C:\Lazarus\fpc\2.6.0\source\rtl\netware".

Ho iniziato mettendo nel mio programma il richiamo a "NWCallsInit", ma non compila. L'errore è il seguente:
Codice: [Seleziona]
unit1.pas(38,24) Error: Identifier not found "NWCallsInit"

Ho provato ad aggiungere tra le uses "nwcalls", ma non compila. Ho provato ad aggiungere la directory "C:\Lazarus\fpc\2.6.0\source\rtl\netware" nei percosi delle altre unit, ma non funziona ugualmente.

C'è qualcuno ha già fatto qualcosa del genere e mi può aiutare a capire come andare avanti?

Grazie, Mario
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: xinyiman - Marzo 20, 2012, 09:08:33 am
Io no, ma se mi alleghi un esempio provo a compilarlo io!
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: bonmario - Marzo 20, 2012, 09:13:46 am
Grazie per la disponibilità.
Ti allego la prova che sto facendo. Per il momento c'è solo la chiamata a NWCallsInit. Nel file compresso c'è anche un estratto di un sorgente in VisualBasic che mi hanno passato e che fa lo stesso lavoro.
Io sto cercando di "tradurlo" in Pascal per poterlo utilizzare in Lazarus.

Grazie ancora, Mario
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: xinyiman - Marzo 20, 2012, 04:49:45 pm
Guarda, non sono riuscito a venirne a capo. Purtroppo in questo periodo ho poco tempo e non riesco a dedicargli tempo. Se qualche altra anima pia trova la soluzione bene, altrimenti ti conviene chiedere aiuto sul forum internazionale e poi quando trovi la risposta ci fai sapere come si fa!
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: nomorelogic - Marzo 20, 2012, 05:42:39 pm
NWCallsInit dovrebbe essere una procedura che si trova nelle librerie client novell
non sono esperto in questa cosa ma dovresti assicurarti di avere client novell installati
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: bonmario - Marzo 20, 2012, 08:29:17 pm
Per xinyiman: Figurati, ti ringrazio comunque per la disponibilità

Per nomorelogic: Sì, il client novell è perfettamente funzionante, anche perché in caso contrario non mi connetterei alla rete aziendale!!!
In ogni caso, il programma fatto in VisualBasic di cui ho allegato un estratto, funziona, quindi il problema non dovrebbe essere lì.

Stasera prima di uscire dal lavoro ho trovato per caso sul sito della Novell dei sorgenti per Delphi in cui c'era, tra le altre cose, la dichiarazione di NWCallsInit. Domani provo con quelli.

Ciao e grazie ancora, Mario
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: bonmario - Marzo 21, 2012, 08:26:12 am
Allora,
ho provato con i sorgenti scaricati dal sito Novell. Ho aggiunto in testa ad un paio di unit l'istruzione
Codice: [Seleziona]
{$mode Delphi}{$H+}
e adesso qualcosa funziona ...

Seguendo l'estratto del programma di VisualBasic, riesco ad eseguire le seguenti funzioni:
NWCallsInit
GetShortPathName
NWParsePath


Purtroppo poi però il programma mi si pianta eseguendo la seguente istruzione:
Codice: [Seleziona]
ccode:=NWScanConnectionsUsingFile(conn, 0, PChar(PathN), intHandle, fileUse, fileised);

Mi esce questo errore:
Codice: [Seleziona]
Il progetto project1 ha sollevato una eccezione di classe 'External: SIGSEGV'

At address 50D40D8B

Dando l'ok mi si apre una finestra di assembler.

Questa è la dichiarazione della funzione NWScanConnectionsUsingFile:
Codice: [Seleziona]
    Function NWScanConnectionsUsingFile (
        conn  :   NWCONN_HANDLE ;
        dirHandle  :   NWDIR_HANDLE ;
        const filePath  :   pnstr8 ;
        iterhandle  :   pnint16 ;
        Var fileUse  : CONN_USING_FILE;
        Var fileUsed  : CONNS_USING_FILE
    ) : NWCCODE;
    stdcall;

Purtroppo non ho mai usato funzioni che usino la "stdcall". Sapete darmi qualche indicazione per cercare di capire dov'è il problema?

Grazie, Mario
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: nomorelogic - Marzo 21, 2012, 10:34:35 am
"stdcall" è una convenzione di chiamata delle procedure contenute nelle librerie (dll / so). in pratica è la convenzione per la lettura dei parametri in memoria e stabilisce che si legge da destra verso sinistra.

ogni volta che si usa una dll/so è obbligatorio sapere quale convenzione è stata usata per la compilazione ed usare la stessa per richiamarne le procedure contenute.

se le librerie sono state scritte in pascal solitamente la convenzione di default è "register" il che vuol dire che non viene allocata memoria per il passasggio dei parametri ma si usano i registri... molto più veloce ovviamente :)
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: bonmario - Marzo 21, 2012, 06:23:54 pm
Quindi mi stai dicendo che mi da il "SIGSEGV" perché c'è qualche parametro sbagliato nella chiamata che faccio, oppure non ho capito niente ?????

Grazie, Mario
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: nomorelogic - Marzo 21, 2012, 06:34:45 pm
SIGSEGV potrebbe infatti dipendere da questa dichiarazione, è una cosa sicuramente da controllare ed è anche semplice farlo:
se la procedura è stata compilata con "stdcall" (come si vede dal codice che hai postato tu) allora nella tua dichiarazione devi riportare "stdcall".

in pratica la tua dichiarazione dovrebbe essere:

Codice: [Seleziona]
   Function NWScanConnectionsUsingFile (
        conn  :   NWCONN_HANDLE ;
        dirHandle  :   NWDIR_HANDLE ;
        const filePath  :   pnstr8 ;
        iterhandle  :   pnint16 ;
        Var fileUse  : CONN_USING_FILE;
        Var fileUsed  : CONNS_USING_FILE
    ) : NWCCODE;
    stdcall; external 'nome_della_libreria.dll';
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: bonmario - Marzo 22, 2012, 08:18:27 am
Niente da fare, non è nemmeno quello.
Guardando la unit messa a disposizione da Novell, ho visto che nell'implementation c'è questa istruzione:
Codice: [Seleziona]
    {$I calwin32.imp}

Il file in oggetto a sua volta contiene questa:
Codice: [Seleziona]
function NWScanConnectionsUsingFile;  StdCall; external 'calwin32.dll' index 361;

Quindi la chiamata dovrebbe essere corretta.

Qualche altra idea?

Grazie, Mario
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: nomorelogic - Marzo 22, 2012, 08:53:20 am
hai già provato a postare qualcosa anche sul forum ufficiale?
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: bonmario - Marzo 22, 2012, 01:33:48 pm
Non ancora ... mi sto documentando e sto facendo un po' di prove. Se per fine settimana non ci sono riuscito, provo a chiedere.
Poi ci metto un po' a "tradurre" la domanda: il mio inglese è mooooolto scarso !!!!
In ogni caso, appena trovo una soluzione la scrivo qui.

Ciao, Mario
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: bonmario - Marzo 22, 2012, 01:53:34 pm
Trovato: dovevo mettere una chiocciolina in più ad un parametro. La chiamata corretta è questa:
Codice: [Seleziona]
ccode:=NWScanConnectionsUsingFile(conn, 0, PChar(PathN), @intHandle, fileUse, fileised);

Ciao e grazie a tutti per l'aiuto !!!!!
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: xinyiman - Marzo 22, 2012, 02:37:21 pm
Son contento che hai risolto  ;)
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: bonmario - Marzo 22, 2012, 06:33:11 pm
Anch'io  ;D ;D ;D ;D

Più che altro, qualcuno ha voglia di spiegarmi la differenza tra le 2 chiamate?
Codice: [Seleziona]
ccode:=NWScanConnectionsUsingFile(conn, 0, PChar(PathN), @intHandle, fileUse, fileised);
ccode:=NWScanConnectionsUsingFile(conn, 0, PChar(PathN), intHandle, fileUse, fileised);

Io sono arrivato a capire che funzionava con la @ andando a tentativi e guardando esempi trovati in rete, ma non so qual'è la differenza ...

Grazie, Mario
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: nomorelogic - Marzo 23, 2012, 08:14:35 am
in effetti avrei dovuto arrivarci guardando il codice da te postato... l'età mi fa brutti scherzi    ::)

in pratica se guardi nella dichiarazione della funzione
Codice: [Seleziona]
iterhandle  :   pnint16 ;
si vede che iterhandle è dichiarato come un puntatore ad un intero: se non metti la @ allora gli stai passando il valore di iterhandle; però, un puntatore, del valore di iterhandle, non sa che farsene: ha bisogno dell'indirizzo di iterhandle (cioè di un indirizzo di memoria dove ci sia memorizzata una variabile di tipo intero). è per questo che entra in gioco l'operatore @ che altro non fa che restituire l'indirizzo di una variabile.
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: bonmario - Marzo 23, 2012, 01:40:17 pm
Grazie, sei stato chiarissimo. Già a scuola avevo difficoltà a lavorare con i puntatori. Sono quelli che si dichiarano col simbolo "^", giusto???

Grazie, Mario
Titolo: Re:Utilizzo di "nwcalls"
Inserito da: nomorelogic - Marzo 23, 2012, 02:47:37 pm
esattamente :)