Avatar of corletted
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)(StringFromVB)) + 1];
     strcpy(filename,(LPSTR)(StringFromVB));
     MessageBox(NULL,filename,"SetFilename",0);
     return 0;
}

BSTR _stdcall GetFilename(){
     MessageBox(NULL,filename,"GetFilename",0);
     return(SysAllocString(getBSTRString(filename)));
}



C++

Avatar of undefined
Last Comment
jkr

8/22/2022 - Mon
jkr

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.
corletted

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;
}
corletted

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?
This is the best money I have ever spent. I cannot not tell you how many times these folks have saved my bacon. I learn so much from the contributors.
rwheeler23
ASKER CERTIFIED SOLUTION
jkr

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
corletted

ASKER
Thanks alot
-Dan
jkr

BTW, you definitely should check the buffer size passed in - insufficiant buffers can cause a lot of headache.