PDA

Visualizza la versione completa : [C] DLL per Visual Basic e passaggio di stringhe


XWolverineX
10-07-2007, 09:08
Ho scritto una semplicissima DLL da usare in VB6...


#define DOWNLOAD_OK 0
#define NO_DISK_SPACE 2
#define ERROR_CONNECTION 1

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

extern "C" __declspec(dllexport) unsigned int __stdcall DettDownload(LPCSTR Url,LPCSTR SavePath)
{
HRESULT t = URLDownloadToFile(NULL,Url,SavePath,0,NULL);
if (t == S_OK)
{
return DOWNLOAD_OK; //Download eseguito
}
else
{
if (t == INET_E_CONNECTION_TIMEOUT)
return ERROR_CONNECTION; //Impossibile connettersi
else
return NO_DISK_SPACE; //Forse non c'è spazio sul disco fisso
}
}


Lasciamo stare il fatto che VisualBasic ha già funzioni per scaricare files,volevo giusto fare una prova e dunque ho creato una dichiarazione del genere...


Public Declare Function DettDownload Lib "Ceil.dll" (ByRef Url As String, ByRef SavePath As String) As Integer


Ora volevo sapere, un char* in C equivale a una string di Vb6?
Ad ogni modo quando uso la funzione,questa mi restituisce sempre e solo 2 (ossia NODISKSPACE), mentre se incollo la funzione in un semplice programma C e la uso, tutto è ok...
Credo di aver sbagliato nella dichiarazione della funzione in VisualBasic, ma non capisco ancora dove...
Grazie!

oregon
10-07-2007, 09:56
Devi dichiarare le stringhe ByVal e il risultato e' un Long perche' l'int per il compilatore C a 32 bit e', appunto, a 32 bit



Public Declare Function DettDownload Lib "Ceil.dll" (ByVal Url As String, ByVal SavePath As String) As Long

XWolverineX
10-07-2007, 10:21
E perchè come byval?
Io ho scelto byref perchè essendo un puntatore a char ho pensato che fosse automaticamente per riferimetno...

oregon
10-07-2007, 11:07
Perche' in VB le stringhe sono delle strutture (BSTR) e quando si passa una stringa alle API viene gia' passato un puntatore a tale struttura. Quindi e' necessario che il puntatore venga passato per valore.

Altrimenti, passeresti un puntatore al puntatore alla stringa, con ovvi risultati negativi.

Se vuoi leggere un articolo che ti puo' aiutare, sebbene non sia recentissimo

Utilizzare codice C/C++ con Visual Basic
http://www.visual-basic.it/articoli/agVB_VC.htm

XWolverineX
10-07-2007, 11:22
Ah ecco grazie sei stato chiarissimo!!!

Loading