Newsgroup: it.comp.lang.visual-basic
Titolo: Bad DLL calling convention..

Declare Function Cobra128_GetDriverInfo Lib "cobra128.dll" (info As
TUCDI_InformationBlock) 
Type TUCDI_InformationBlock
   pdrivername as ??
   unBlockSize As Integer
   unKeySize As Integer 
   ucBlockLink As Byte
   ucOwnHasher As Byte
   unInitDataSize As Integer 
   ulContextSize As Long
End Type
Dim x As TUCDI_InformationBlock
Call Cobra128_GetDriverInfo(x)
Perche' genera l'errore ? In particolare non capisco come va
dichiarata la string pdrivername, ho provato con un vettore di byte,
ma niente da fare... Alcuni valori ritornati da alcuni parametri sono
quelli attesi anche se in posizioni diverse...
Grazie per l'aiuto ,Francesco..
/* the following structure is returned by UCDI_GetDriverInfo() */
typedef struct {
   /* name of the driver */
   char* pDriverName;
   /* size of one cipher block in bytes (max. 64kB),
      a stream cipher must return 1 */
   UINT16 unBlockSize;
   /* key size (max. 64kB). Can be 0, e.g. for individual
      DLLs simulating a keycard. */
   UINT16 unKeySize;
   /* Does the driver link the single blocks (if any)?
      0 : blocks are not linked (ECB)
      1 : blocks are linked (CBC,...) */
   UCHAR ucBlockLink;
   /* Does the driver hash the password by its own routines?
      0: the application must deliver a key already hashed
         to nKeySize bytes
      1: the driver gets the raw password */
   UCHAR ucOwnHasher;
   /* size of the initialisation data in bytes (max. 64kB),
      e.g. 8 for a 64bit block cipher in CBC mode (IV) or 0 for any
      block cipher in ECB mode */
   UINT16 unInitDataSize;
   /* size of a cryptdriver context, necessary for a proper
      multitasking. Every caller's actual state is stored
      in a context, e.g. the actual IV or pbox/sbox contents. */
   ULONG ulContextSize;
} TUCDI_InformationBlock;
function Cobra128_GetDriverInfo(var Info: TUCDI_InformationBlock) :
ULONG; cdecl; external 'Cobra128.ucd';

 ULONG; cdecl; external 'Cobra128.ucd';
Tutto Ok se non per il membro pdrivername.
Infatti in C viene definito come puntatore.  :-(
Il VB non ha il concetto di puntatore (se non con il passaggio di
parametri per riferimento).
Si possono pero' fare dei trucchi, vili trucchi, per risolvere il
problema.
Windows fornisce la funzione lstrcpy() con la quale si puo' giocare un
po'.
Prima cosa definisci la struttura come segue:
Type TUCDI_InformationBlock
   pdrivername As Long  ' un puntatore FAR e' un long
   unBlockSize As Integer
   unKeySize As Integer 
   ucBlockLink As Byte
   ucOwnHasher As Byte
   unInitDataSize As Integer 
   ulContextSize As Long> End Type
End Type
quindi se e' la funzione Cobra128_GetDriverInfo() a riempire la
struttura e
tu devi leggerla fai cosi':
    Declare Function CopiaStrC Lib "Kernel" Alias "lstrcpy" (ByVal
lpString1 As string, ByVal lpString2 As Long) As Long
    Dim st     As TUCDI_InformationBlock
    Dim Esito  As Variant  'non ho capito il tipo di valore di ritorno
    Dim Nome$
    Dim PtrStr As Long
    Esito = Cobra128_GetDriverInfo(st)
    Nome$ = space$(2048)
    PtrStr = CopiaStrC(Nome$,st.pdrivername)
    Nome$ = Left$(Nome$,InStr(Nome$,Chr$(0))-1)
In questo modo ti ritrovi il nome del driver nella variabile Nome$
Se invece tu devi inizializzare il campo st.pdrivername con un valore
valido prima di chiamare la funzione Cobra128_GetDriverInfo() allora
devi fare:
    Declare Function CopiaStrC Lib "Kernel" Alias "lstrcpy" (ByVal
lpString1 As string, ByVal lpString2 As String) As Long
    Dim st     As TUCDI_InformationBlock
    Dim Esito  As Variant  'non ho capito il tipo di valore di ritorno
    Dim Nome$
    Dim PtrStr As Long
    Nome$ = space$(2048)
    PtrStr = CopiaStrC(Nome$,chr$(0))
    st.pdrivername = PtrStr
    Esito = Cobra128_GetDriverInfo(st)
    Nome$ = Left$(Nome$,InStr(Nome$,Chr$(0))-1)
Fine. Spero che mi sei stato dietro. I sorgenti lo scritti al volo
quindi sono passibili di errorini, ma in complesso deve funzionare.
Fammi sapere
Hi, Ciao
-- 
By  /\   /\    
   / _\ / _\  
  / <_   <_ \  
 / <_______> \  Software  ( Maronese Ettore )