From: <pau...@wi...> - 2004-12-20 10:20:28
|
Hi V.R.Anand and Reg: I tried your example V.R. Anand and I am having some proplems with it. Fist I will state my code, and from there explain the reasons for my changes. ----cvtup.cpp----- #include <string.h> #if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else /* Not BUILDING_DLL */ # define DLLIMPORT __declspec (dllimport) #endif /* Not BUILDING_DLL */ /*Trivial code to convert an input string to upper case. Intended to demonstrate interfacing a MINGW C DLL with MS Excel through a VBA macro. */ DLLIMPORT int cvtup(char *str) { int i=0; for(i=0; i< strlen(str); i++){ if((str + i) >= "a" && (str + i ) <= "z"){ str[i] += "A" - "a"; } } return strlen(str); } ----end of cvtup.cpp---- ----vb code --- ' Retrive Function Private Declare Function cvtup Lib "C:\Documents and Settings\Admin\My Documents\Com-MinGW\VbStringConverter\cvtup.dll" _ (ByRef Bstr As Byte) As Long Private Sub cmdEnter_Click() Dim Str As String, Bstr() As Byte, L As Long ' Get input text Str = Me.txtIN.Text ' Calculate the size of string L = Len(Str) ' Allocate memory to byte array to hold the string. ' Allocate L+1 bytes to allow for terminal null character for C string. ReDim Bstr(1 To L + 1) ' Copy string bytes to byte array. For I = 1 To L Bstr(I) = Asc(Mid(Str, I, 1)) Next I Bstr(L + 1) = 0 ' terminal null byte for C string ' Call the function in the MinGW DLL L = cvtup(Bstr(1)) Str = "" ' initialize output string ' Copy bytes from function output back to VB string For I = 1 To L Str = Str + Chr(Bstr(I)) Next I ' Display output Me.txtOUT.Locked = False Me.txtOUT.Text = Str Me.txtOUT.Locked = True End Sub ----End VB code-------- When I first read your post I wanted to try and compile it in c++. So using the example in the cvtup.c file. I compile it as a c++ app using the following command mingw32-g++ -c -DBUILDING_DLL=1 -mrtd -g -O2 -o cvtup.o cvtup.c And scored a wired error, not shure why. But for some reason the ISO standord dose not allow str[i] in an if statment. ( I compile it on borland and VC++ and recived the same complant ) It will allow for (str + i) instead. That was the only real change I made to the file. recompile it and used the following for the dllwarp dllwrap -s --export-all --output-def cvtup.def --driver-name mingw32-g++ -o cvtup.dll cvtup.o And it worked. As expected. Next I proceded to make a simple form in VB6 Two text boxes, txtIN and txtOUT. For inputting and outputting the results, respective to var names. Also a command button to take action. In the example when you declared your function by default as Public. VB when compling the could state that it should be private so i make the change. VB was happy. So I proceded to run the app in debug mode. When it arived to the line: L = cvtup(Bstr(1)). It buged out with a statment of: Run-time error '453': Can't find DLL entry point cvtup in C:\Documents and Settings\Admin\My Documents\Com-MinGW\VbStringConverter\cvtup.dll |