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:
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
Allora,
ho provato con i sorgenti scaricati dal sito Novell. Ho aggiunto in testa ad un paio di unit l'istruzione
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:
ccode:=NWScanConnectionsUsingFile(conn, 0, PChar(PathN), intHandle, fileUse, fileised);
Mi esce questo errore:
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:
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
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:
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';
Niente da fare, non è nemmeno quello.
Guardando la unit messa a disposizione da Novell, ho visto che nell'implementation c'è questa istruzione:
Il file in oggetto a sua volta contiene questa:
function NWScanConnectionsUsingFile; StdCall; external 'calwin32.dll' index 361;
Quindi la chiamata dovrebbe essere corretta.
Qualche altra idea?
Grazie, Mario
Trovato: dovevo mettere una chiocciolina in più ad un parametro. La chiamata corretta è questa:
ccode:=NWScanConnectionsUsingFile(conn, 0, PChar(PathN), @intHandle, fileUse, fileised);
Ciao e grazie a tutti per l'aiuto !!!!!
Anch'io ;D ;D ;D ;D
Più che altro, qualcuno ha voglia di spiegarmi la differenza tra le 2 chiamate?
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