Newsgroup: it.comp.lang.c
Titolo: RE [?] Vb, DLL, C

Ciao a tutti!
Ho letto l' altro giorno di un accorato appello lanciato da qualcuno
per fare una DLL in C e richiamarla da un programma Visual Basic.
Mi scuso con l' autore della email, ma ho purtroppo l' originale ( con
accluso il nome) si è persa ( un "purge" di troppo, evidentemente!)
Comunque io tempo fa avevo risolto questo problema usando Visual Basic
3.0 ed il vecchio compilatore della Borland. Non so se funziona bene
sotto win 95, anche perchè ora come ora lavoro con COM.
Questo è uno stralcio, spero che possa risolvere il problema in
qualche maniera!!!
Saluti... -=PJ=-
P.s.: non guardate i contenuti, erano delle vecchie routines per
collegare dell' hardware ad un pc...
*** FILE . def ***
LIBRARY   EDIPO
EXETYPE   WINDOWS
CODE      PRELOAD MOVEABLE DISCARDABLE
DATA      PRELOAD MOVEABLE SINGLE
HEAPSIZE  4096
EXPORTS	  BEEP_ON
EXPORTS	  BEEP_OFF
EXPORTS   RGBCOMP
EXPORTS   RCOMP
EXPORTS   GCOMP
EXPORTS   BCOMP
EXPORTS   RESETTA
EXPORTS   M1RESET
EXPORTS   M1SPR_HI
EXPORTS   M1SPR_LO
EXPORTS   M1EMG_HI
EXPORTS   M1EMG_LO
EXPORTS   M1CARDIO
EXPORTS   M1TERMO
EXPORTS   MEDIA
EXPORTS   GET_SPRZERO
**** FILE .C (o .CPP) con il nucleo della DLL
#include <windows.h>
#include <dos.h>
#include <time.h>
#include <sys\timeb.h>
#include <stdlib.h>
/**********************************************************
 *
 * DICHIARAZIONI PER LA DLL
 *
 **********************************************************/
 int  FAR PASCAL _export RESETTA();
 int  FAR PASCAL _export AZIONE(int dir, int dato);
 int  FAR PASCAL _export SPR(void);
 int  FAR PASCAL _export EMG(void);
 int  FAR PASCAL _export CARDIO(void);
 int  FAR PASCAL _export TERMO(void);
 int  FAR PASCAL _export RESIST(void);
 int  FAR PASCAL _export SETTAMS(int ms);
/**********************************************************
 *
 *  VARIABILI GLOBALI
 *
 **********************************************************/
 int scrivere;
 int fine;
 unsigned char f_d, portba, tport1, tport2;
 int v_spr;
 int v_emg;
 int v_cardio;
 int v_termo;
 int v_resist;
 int msecs;
 void scrivi(unsigned char numero);
 static HANDLE hInstance;
/***********************************************************/
void scrivi(unsigned char numero)
{
  register int j,conta;
  unsigned char nfd,leggi_p,a,b;
  scrivere = 0x00;
  j=0;
  f_d = (inp(0x0379)&16);
  for(conta=1;conta<10000;conta++);
  while ((inportb(0x0379)&16)==f_d)
  {
    j++;
    if (numero&0x1)
    {
      outportb(0x0378, inportb(0x0378)|1);
    }
    else
    {
      outportb(0x0378, inportb(0x0378)&254);
    }
    numero >>=1;
    j++;
    if (numero&0x1)
    {
      outportb(0x0378, inportb(0x0378)|2);
    }
    else
    {
      outportb(0x0378, inportb(0x0378)&253);
    }
    numero >>=1;
    if (j<=8) {
	 outportb(0x0378, inportb(0x0378)&251);
	      }
    leggi_p = inportb(0x0378);
    if ((leggi_p&16)== 16)
    {
      outportb(0x0378, leggi_p&239);
    }
    else
    {
	outportb(0x0378, leggi_p|16);
    }
      a=((inportb(0x0378)&16)>>4);
      b=((inportb(0x0379)&32)>>5);
   while(a!=b)
    {
      a=((inportb(0x0378)&16)>>4);
      b=((inportb(0x0379)&32)>>5);
    }
  }
}
int  FAR PASCAL _export RESETTA()
{
   int bo;
   scrivere=0x00;
   outportb(0x0378, inportb(0x0378)&251);
   outportb(0x0378, inportb(0x0378)&247);
   outportb(0x0378, inportb(0x0378)&247);
   for(bo=1;bo<=10000;bo++);
   outportb(0x0378, inportb(0x0378)|8);
   outportb(0x0378, inportb(0x0378)|8);
   for(bo=1;bo<=20000;bo++);
   putenv("TZ=PST8PDT");
   tzset();
   msecs = 100;
   return(0);
}
int  FAR PASCAL _export SPR()
{
   return(v_spr);
}
int  FAR PASCAL _export EMG()
{
   return(v_emg);
}
int  FAR PASCAL _export CARDIO()
{
   return(v_cardio);
}
int  FAR PASCAL _export TERMO()
{
   return(v_termo);
}
int  FAR PASCAL _export RESIST()
{
   return(v_resist);
}
int FAR PASCAL _export SETTAMS(int ms)
{
   msecs = ms;
   return(0);
}
int FAR PASCAL _export AZIONE(int dir, int dato)
{
   register int conta, mylp;
   register int tem_emg=0;
   register int tem_spr=0;
   register int tem_ter=0;
   register int tem_car=0;
   register int tem_res=0;
   register long int t_spr=0;
   register long int t_emg=0;
   register long int t_car=0;
   register long int t_ter=0;
   register long int t_res=0;
   struct timeb t;
   long int millis, millisnow;
   scrivere=0x00;
   f_d =  (inportb(0x0379)&16);
   /* resetta le variabili finali, che saranno lette dall'esterno */
   v_spr = 0;
   v_emg = 0;
   v_cardio = 0;
   v_termo = 0;
   v_resist = 0;
   mylp = 0;
   ftime(&t);
   millis = millisnow =t.millitm;
   while (millisnow <= (millis+msecs))
   {
	tem_spr = 0;
	tem_emg = 0;
	tem_car = 0;
	tem_ter = 0;
	tem_res = 0;
	conta = 1;
	while ((inportb(0x0379)&16)==f_d)
	{
		while (((inportb(0x0378)&16)>>4) ==
((inportb(0x0379)&32)>>5 ));
		tport1 = tport2 = inportb(0x0379)&192;
		portba = ((tport1>>6)&1)|(((!(tport2>>7))&1)<<1);
		if (conta<=6)
		{
		  tem_spr <<= 2;
		  tem_spr |= portba;
		}
		if (conta>=7&&conta<=12)
		{
		  tem_emg <<= 2;
		  tem_emg |= portba;
		}
		if (conta>=13&&conta<=18)
		{
		  tem_ter <<= 2;
		  tem_ter |= portba;
		}
		if (conta>=19&&conta<=24)
		{
		  tem_res <<= 2;
		  tem_res |= portba;
		}
		if (conta>=25&&conta<=30)
		{
		  tem_car <<= 2;
		  tem_car |= portba;
		}
		conta ++;
		if (dir)
		{
			 outportb(0x0378, inportb(0x0378)|4);
			 scrivere=0x01;
			 dir = 0x00;
		}
		if ((inportb(0x0378)&16)== 16)
		{
			outportb(0x0378, inportb(0x0378)&239);
		}
		else
		{
			outportb(0x0378, inportb(0x0378)|16);
		}
	}
	if (scrivere) scrivi((unsigned char)dato);
	f_d =  (inportb(0x0379)&16);
	t_spr += tem_spr;
	t_emg += tem_emg;
	t_car += tem_car;
	t_ter += tem_ter;
	t_res += tem_res;
	mylp++;
	ftime(&t);
	millisnow =t.millitm;
   }
   v_spr = (int)(t_spr/mylp);
   v_emg = (int)(t_emg/mylp);
   v_cardio= (int)(t_car/mylp);
   v_termo= (int)(t_ter/mylp);
   v_resist= (int)(t_res/mylp);
   return(0);
}
int FAR PASCAL LibMain(
	HANDLE	hInst,
	WORD	wDataSeg,
	WORD	cbHeapSize,
	LPSTR	lpszCmdLine)
{
	hInstance = hInst;
	return 1;
}
/*
void main()
{
   register int conta;
   reset();
   fine=0x00;
   while (!fine)
   {
     if (kbhit())
     {
	switch(getchar())
	{
		case 'f':
		case 'F': fine = 0x01;
			  break;
		case 's':
		case 'S': azione(1, 123);
			  break;
		default :
			  break;
	}
     }
     azione (0,0);
     clrscr();
     printf ("spr = %d emg = %d termo = %d cardio  = %d resist =
%d\n", v_spr, v_emg, v_termo, v_cardio, v_resist);
   }
} */
*** E DAL PUNTO DI VISTA BASIC.... ***
Declare Function RGBCOMP Lib "EDIPO.dll" (ByVal myrgb As Long) As
Integer
Declare Function RCOMP Lib "EDIPO.dll" () As Integer
Declare Function GCOMP Lib "EDIPO.dll" () As Integer
Declare Function BCOMP Lib "EDIPO.dll" () As Integer
Declare Function BEEP_OFF Lib "EDIPO.dll" () As Integer
Declare Function BEEP_ON Lib "EDIPO.dll" (ByVal Freq%) As Integer
Declare Function MEDIA Lib "EDIPO.dll" (ByVal lung As Integer, ByVal
mystr$) As Integer
Declare Function GET_SPRZERO Lib "EDIPO.dll" (ByVal lung As Integer,
ByVal mystr$) As Integer
Declare Function M1RESET Lib "EDIPO.dll" () As Integer
Declare Function RESETTA Lib "EDIPO.dll" () As Integer
Declare Function M1SPR_HI Lib "EDIPO.dll" () As Integer
Declare Function M1SPR_LO Lib "EDIPO.dll" () As Integer
Declare Function M1EMG_HI Lib "EDIPO.dll" () As Integer
Declare Function M1EMG_LO Lib "EDIPO.dll" () As Integer
Declare Function M1CARDIO Lib "EDIPO.dll" () As Integer
Declare Function M1TERMO Lib "EDIPO.dll" () As Integer
Spero funzioni ancora a distanza di anni!!!
-=PJ=-

 
UAO! GOSH! Devo ammettere che mi ci sono perso! In ogni caso avevo gia'
risolto, grazie. Solo due righe per spiegare come, a chi si fosse comunque
posto il problema senza riuscire a risolverlo.
In VB basta chiamare la funzione Pippo(par) avendo l'accortezza di avere
dichiarato in un modulo
public declare function Pippo lib "path/lib.dll" alias "PIPPO" _
	(byval par as long) as long
Si crea poi una DLL col builder (e' automatico) e nella dll si inserisce
la dichiarazione dell'entry point ovvero:
extern int _pascal __declspec(dllextern) Pippo(int par)
{...}
il punto fondamentale e' ricordarsi di inserire il modificatore _pascal
che permette il corretto passaggio dei parametri da VB a C++
Ciao e grazie ancora
								Paolo
8-{>
La scienza gonfia, la Carita' edifica (Paolo di Tarso)