Newsgroup: it.comp.appl.access
Titolo: Access e DLL

Salve a tutti,
non riesco a far comunicare correttamente il C e VBA!!
Per le funzioni senza parametri, non ci sono problemi. Ma i problemi
arrivano quando devo passare anche un semplice intero.
Prima si lamentava sulle "convenzioni di chiamata", e pensavo di risolvere
utilizzando la convenzione stdcall, ma a quel punto diceva che non trovava
il punto di ingresso corretto nella dll. Ho provato a togliere il
trattino dall'Alias, e TUTTO SI E' IMPALLATO. Riavviando Access, ora dice
che quella DLL (attenzione, io non ho cambiato NULLA) non la trova più. :/
Qui c'è il codice della DLL di prova, ed il codice utilizzato da access.
Se qualcuno può aiutarmi, per favore lo faccia. Non so più cosa fare :(
8<------8<------ dll.h 8<------8<------
#include <windows.h>
/* per facilitare l'esportazione */
#define EXPORT __declspec(dllexport)
EXPORT int FAR PASCAL LibMain(HANDLE hModule, WORD wDataSeg,
		WORD cbHEapSize, LPSTR lpszCmdLine);
EXPORT int __stdcall ret(int a);
EXPORT char* __stdcall retstr(char* str);
EXPORT int torna4();
8<------8<------ dll.c 8<------8<------
#include <stdio.h> 
#include <stdlib.h>
#include "dll.h"
/* Ho letto che questa serve comunque... */
EXPORT int FAR PASCAL LibMain(HANDLE hModule, WORD wDataSeg,
		WORD cbHEapSize, LPSTR lpszCmdLine) {
	return TRUE;
}
EXPORT int __stdcall ret(int a) {
	return a;
}
EXPORT char* __stdcall retstr(char* str) {
	return str;
}
EXPORT int torna4() {
	return ret(4);
}
8<------8<------ dichiarazioni in un modulo access 8<------8<------
Option Compare Database
Option Explicit
Public Declare Function torna4 Lib "test.dll" () As Integer
Public Declare Function retstr Lib "test.dll" _
Alias "_retstr@4" (str As String) As String
Public Declare Function ret Lib "test.dll" _
Alias "_ret@4" (a As Integer) As Integer
8<------8<------ chiamate da una maschera 8<------8<------
Option Compare Database
Option Explicit
Private Sub cmdProva_Click()
    Dim s As String, prova As String
    prova = "prova"
    s = retstr(prova)"
    MsgBox s
End Sub
-----------------------------------------------------------
Ho usato il GCC, nel seguente modo:
gcc dll.c -c
gcc -shared -o test.dll dll.o -Wl --out-implib
Grazie mille in anticipo! :)
PS. Scusate per il crosspost, ma penso sia appropriato.
Followup-to: it.comp.appl.access
-- 
[ Andrea Spadaccini a.k.a. Lupino / Lupin85 - from Catania ]
[ MAIL: lupin85(at)
email.it
 - ICQ: 91528290 - Linux 2.4.22 ]
[ Linux Registered User #313388 - Powered by Slackware 9.1 ]

"Lupino" <ask...@if.youwant> ha scritto nel messaggio
news:pan.2004.11.25....@if.youwant...

Ciao Lupino,
non ho esperienza con GCC, di solito uso Microsoft Visual C e lì uso per le
dichiarazioni:
Es:
int  far PASCAL torna4()
{
    torna4= 4;
}
 Utilizzo poi un file di definizioni TUADLL.DEF, in cui dichiaro quali
funzioni devono essere esportate fatto più o meno così:
LIBRARY   TUADLL
DESCRIPTION 'Bla Bla Bla'
HEAPSIZE  1024
EXPORTS
 torna4 @1
 retstr @2
In Access invece la dichiaro così:
 Declare Function Compress Lib "tuadll.dll" () As Long
Spero possa esserti utile!
Saluti
Cinzia


[...]
Ciao,
nella dichiarazione della variabile parametro in VBA
mettici un  *ByVal* str as String. I parametri, per
convenzione, devono venire passati per valore anche
se poi in realta' saranno per riferimento.
Inoltre nella routine di chiamata fai precedere un
str=string(255,0), ovvero inizializza la stringa con
il carattere null (0). In C e' opportuno che la stringa
sia inizializzata.Quando poi, dopo la chiamata la
riutilizzi, usa una InStr(...  ad esempio :
str=Left$(str, InStr(str, Chr(0)))
Ciao
lorenzo