Newsgroup: it.comp.programmare.win32
Titolo: dll e visual basic

	ciao a tutti
sperando di non essere ot, vi ripropongo un quesito che ho postato
anche su it.comp.lang.c++ (ma che forse li' e' ot...)
ho scritto una dll in c++... (pur avendo una scarsa infarinatura di c
e basta) che accetta due char*, il primo su cui legge, e il secondo su
cui scrive (sostanzialmente, deve copiare una parte delle parole dalla
prima stringa alla seconda),e la chiamo da VB, ma mi da erroe: credo
ci sia qualche pasticcio sui byval e byref: io passo entrambe come
byval (c'e' scritto cosi' sulla MSDN...) pero' credo abbia dei
problemi con la scrittura sulla seconda stringa, perche' quando la dll
cerca di scrivere sulla seconda stringa mi si blocca tutto vb6 ("il
programma ha eseguito" ecc.) mentre se non ci sono parole da copiare
dalla prima alla seconda stringa, e quindi non me la tocca, mi dice
solo che ho sbagliato a passare i parametri alla dll...
qualcuno mi sa dire come fare? mi andrebbe bene anche se la funzione
restituisse la seconda stringa... ma non saprei poi da vb leggere la
stringa intera a partire da un char*... 
spero di essermi spiegato... se non e' cosi' chiedete pure... :-)
meew alle prime armi

non ne sono completamente sicuro, ma credo che la seconda debba essere
byref.
byref consente che tu la modifichi da una chiamata all'altra, byval no.
e byref forse andrebbe specificato sia nella dichiarazione (non so come fa
in C, forse ti toglie l'asterisco...), sia nella dichiarazione in VB
Mario

 writes:
m> ho scritto una dll in c++... (pur avendo una scarsa infarinatura di c
m> e basta) che accetta due char*, il primo su cui legge, e il secondo su
m> cui scrive (sostanzialmente, deve copiare una parte delle parole dalla
m> prima stringa alla seconda),e la chiamo da VB,
Se non  ricordo male  è byref su  tutte e  due le stringhe  (ovvero il
default  quando  non  indichi nulla)  ed  il  runtime  passa al  C  un
puntatore as una stringa null terminated -ho come l'impressione che il
VB gestisca le stringhe in  modo diverso :)-.  
Fare  un passaggio  byval  equivarrebbe a  ricopiare l'intera  stringa
sullo stack, che non  è quello che il C (o il C++  se è per questo) si
aspetta.
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: sierra alfa india november tango AT echo november golf DOT india tango

Ciao,
proprio oggi mi sono scontrato con lo stesso problema, ecco il mio
codice di prova funzionante
mydll.cpp
#define STRICT
#include <windows.h>
BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,
LPVOID lpReserved)
{
    return TRUE;
}
int WINAPI Test(HWND hwnd,char *buffer)
{
	HINSTANCE hInst;
	hInst=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
	MessageBox(hwnd,buffer,"DLL",0);
CreateWindow("STATIC","Ciccio",WS_CHILD|WS_VISIBLE|WS_BORDER,0,0,100,50,hwnd,(HMENU)100,hInst,NULL);
	strcpy(buffer,"ciao");
	return 1234;
}
----
mydll.def
LIBRARY mydll.dll
EXPORTS Test
---
Form1.frm
Private Declare Function Test Lib "c:\documenti\mydll.dll" (ByVal Hwnd
As Long, ByVal Buffer As String) As Long
Private Sub Command1_Click()
   Dim Buffer As String
   Dim i As Long
 
   Buffer = Text1.Text
 
   i = Test(Me.Hwnd, Buffer)
 
   MsgBox i & vbCrLf & Buffer
End Sub
---
Questo test mi serviva per capire come passare stringhe da VB a C,
modificarle e ritornarle insieme ad  valore, oltre a creare una
finestra sul form.
Ho notato che se non si mette ByVal nella declare VB6 va in crash
(oleaut32.dll error)
Ciao !
Stefano "HappyMan"
IABLA Sezione Lago Maggiore (NO)
Foto salseri/e & I.A.B.L.A. Ring
http://happyman.freeweb.org

aspetta.
il ragionamento e' giusto... ma bisogna passare byref msdn dice che
vb usa le BSTR, che hanno un header che dice la lunghezza e altre
cose... mentre di norma le dlll usano LPSTR , cioe' *char--- e quindi
di passarle byval (byref punterebbe infatti all'indirizzo
dell'header... che non va bene... e dice  
"If a DLL procedure expects an LPSTR (a pointer to a null-terminated
string) as an argument, pass the BSTR by value. Because a pointer to a
BSTR is a pointer to the first data byte of a null-terminated string,
it looks like an LPSTR to the DLL procedure."
ma facendo cosi' e basta si impallava... sono riuscito a risolvere il
problema cosi':(ma e' molto sgrezzo!) in vb faccio una stringa e la
riempio di caratteri (nel mio caso ho messo tanti "-"... va bene con
tutto ma non coi VbNullString), e la passo byval,  dentro la dll
scrivo col memcpy sul secondo carattere della stringa un \0, poi da li
me ne frego e faccio il strcat con le varie parole... e cosi'
magicamente funziona... perche' lo strcat crede che la stringa sia
finita (ma in realta' in vb le avevo allocato molto + spazio) e
appiccica li' le altre stringhe, e poi quando le restituisce la
stringa finisce con un bel null... e vb non se la mena troppo...
ecco... magari vi interessava :-)
grazie ancora
meew, che finalmente ha fatto un programmino con una dll ed e' tutto
gasato... ma ancora ci mette troppo a fare i temi d'esame di
informatica...