corletted
asked on
How To/Best Practices: Passing Strings from C++ DLL to VB calling Application:
Hello,
My problem is passing strings back to VB from a DLL i wrote in C++. I have an API for some software written all in C, my desire was to wrap this api into a DLL so that I can use it in my VB app. I just want to be able to pass strings of variable length from the C++ DLL to VB. The C++ will be generating reponses in the form
of strings that are passed back to the VB app. I have read everything I can get my hands on and have not been able to get it to work. Here are my VB and C++ functions.
Thanks.
-Dan
ERROR: The error I am getting is that the string is not getting returned correctly through GetFilename. I know that filename in the DLL gets set using
SetFilename and contains the string I passed in SetFilename. When I call GetFilename the correct string is printed in the message box. When
I try to print the string returned from GetFilename in the VB app, it contains junk. Consistently its the letter "d", cant figure it out.
P.S. I also have some persistant data structures in my DLL, I have very limited knowledge about memory models and windows programming. Is it ok to have
a persistant datastructure in a DLL. I read that DLLs have to be thread safe? I can guarantee only one app will be calling this DLL.
VB Code.
-------------------------- ---------- ---------- ---------- ---------- ----
Private Declare Function SetFilename Lib "MyDLL.DLL" (ByVal S As String) As Long
Private Declare Function GetFilename Lib "MyDLL.DLL" () As String
Private Sub Command1_Click()
'I am just taking in the string from a text box
SetFilename (CStr(Text1.text))
Dim Temp as String
Temp = GetFilename
End Sub
C++ Code (portion reponsible for the string being passed to VB)
-------------------------- ---------- ---------- ---------- ---------- ----
char *filename=NULL;
long _stdcall SetFilename(BSTR StringFromVB){
filename = new char[strlen((LPSTR)(String FromVB)) + 1];
strcpy(filename,(LPSTR)(St ringFromVB ));
MessageBox(NULL,filename," SetFilenam e",0);
return 0;
}
BSTR _stdcall GetFilename(){
MessageBox(NULL,filename," GetFilenam e",0);
return(SysAllocString(getB STRString( filename)) );
}
My problem is passing strings back to VB from a DLL i wrote in C++. I have an API for some software written all in C, my desire was to wrap this api into a DLL so that I can use it in my VB app. I just want to be able to pass strings of variable length from the C++ DLL to VB. The C++ will be generating reponses in the form
of strings that are passed back to the VB app. I have read everything I can get my hands on and have not been able to get it to work. Here are my VB and C++ functions.
Thanks.
-Dan
ERROR: The error I am getting is that the string is not getting returned correctly through GetFilename. I know that filename in the DLL gets set using
SetFilename and contains the string I passed in SetFilename. When I call GetFilename the correct string is printed in the message box. When
I try to print the string returned from GetFilename in the VB app, it contains junk. Consistently its the letter "d", cant figure it out.
P.S. I also have some persistant data structures in my DLL, I have very limited knowledge about memory models and windows programming. Is it ok to have
a persistant datastructure in a DLL. I read that DLLs have to be thread safe? I can guarantee only one app will be calling this DLL.
VB Code.
--------------------------
Private Declare Function SetFilename Lib "MyDLL.DLL" (ByVal S As String) As Long
Private Declare Function GetFilename Lib "MyDLL.DLL" () As String
Private Sub Command1_Click()
'I am just taking in the string from a text box
SetFilename (CStr(Text1.text))
Dim Temp as String
Temp = GetFilename
End Sub
C++ Code (portion reponsible for the string being passed to VB)
--------------------------
char *filename=NULL;
long _stdcall SetFilename(BSTR StringFromVB){
filename = new char[strlen((LPSTR)(String
strcpy(filename,(LPSTR)(St
MessageBox(NULL,filename,"
return 0;
}
BSTR _stdcall GetFilename(){
MessageBox(NULL,filename,"
return(SysAllocString(getB
}
Check out http://support.microsoft.com/default.aspx?scid=kb;en-us;187912 ("How To Pass a String Between Visual Basic and Your C DLL") - this works without BSTRs.
ASKER
I seem to get results with the following changes. I dont want to cause memory leaks, can someone verify the following solution?
Thanks
char * filename=NULL;
Private Declare Function GetDictionary Lib "MyDLL.DLL" _
(ByVal tempStr As String) As String
char* _stdcall GetDictionary( char* snmpmsg){
strcpy(snmpmsg, filename);
return snmpmsg;
}
Thanks
char * filename=NULL;
Private Declare Function GetDictionary Lib "MyDLL.DLL" _
(ByVal tempStr As String) As String
char* _stdcall GetDictionary( char* snmpmsg){
strcpy(snmpmsg, filename);
return snmpmsg;
}
ASKER
-jkr,
none of those examples address how to pass strings from the C++ DLL "to" the VB app.
I have not problems passing strings to the C++ DLL "from" the VB app.
-dan
did I missing something on those articles?
none of those examples address how to pass strings from the C++ DLL "to" the VB app.
I have not problems passing strings to the C++ DLL "from" the VB app.
-dan
did I missing something on those articles?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks alot
-Dan
-Dan
BTW, you definitely should check the buffer size passed in - insufficiant buffers can cause a lot of headache.