bad dll calling convrention
-
I have in my VB:
Call MyCString(myStringCopy, k, lengthOfStrings)
with:
Dim myStringCopy As String ' no fixed size
Dim k
Dim lengthOfStrings
Dim MyString(0 To 2) As StringMyString(0) = "a" MyString(0) = Left(MyString(0) & String(10, Chr(0)), 10) MyString(1) = "bbbb " MyString(1) = Left(MyString(1) & String(10, Chr(0)), 10) MyString(2) = "mmmm" MyString(2) = Left(MyString(2) & String(10, Chr(0)), 10) For i = 0 To 2 myStringCopy = myStringCopy + MyString(i) Next
=========== Public Declare Sub MyCString Lib "MyProj.dll" _ Alias "?MyCString@@YGXPAD@Z" (ByVal ByValString As String, numberOfStrings As Long, lengthOfStrings As Long) ==================== The C dll: i
nt MakeArray(char* ByValString, int numberOfStrings, int lengthOfStrings, char*** pStringArray)
{
int i;\*pStringArray = (char\*\*) malloc(numberOfStrings\*sizeof(char\*)); if (!(\*pStringArray)) return(1); for (i = 0 ; i < numberOfStrings ; i++) { (\*pStringArray)\[i\] = &(ByValString\[lengthOfStrings\*i\]); } return(0);
}
__declspec( dllexport ) void MyCString(char * ByValString,int numberOfStrings, int lengthOfStrings)
{
char** stringArray;rtnVal = MakeArray(ByValString, numberOfStrings , lengthOfStrings, &stringArray); printf(stringArray\[1\]); free(stringArray);
}
I get bad dll calling convention. Please help!! Appreciate your help, ns
-
I have in my VB:
Call MyCString(myStringCopy, k, lengthOfStrings)
with:
Dim myStringCopy As String ' no fixed size
Dim k
Dim lengthOfStrings
Dim MyString(0 To 2) As StringMyString(0) = "a" MyString(0) = Left(MyString(0) & String(10, Chr(0)), 10) MyString(1) = "bbbb " MyString(1) = Left(MyString(1) & String(10, Chr(0)), 10) MyString(2) = "mmmm" MyString(2) = Left(MyString(2) & String(10, Chr(0)), 10) For i = 0 To 2 myStringCopy = myStringCopy + MyString(i) Next
=========== Public Declare Sub MyCString Lib "MyProj.dll" _ Alias "?MyCString@@YGXPAD@Z" (ByVal ByValString As String, numberOfStrings As Long, lengthOfStrings As Long) ==================== The C dll: i
nt MakeArray(char* ByValString, int numberOfStrings, int lengthOfStrings, char*** pStringArray)
{
int i;\*pStringArray = (char\*\*) malloc(numberOfStrings\*sizeof(char\*)); if (!(\*pStringArray)) return(1); for (i = 0 ; i < numberOfStrings ; i++) { (\*pStringArray)\[i\] = &(ByValString\[lengthOfStrings\*i\]); } return(0);
}
__declspec( dllexport ) void MyCString(char * ByValString,int numberOfStrings, int lengthOfStrings)
{
char** stringArray;rtnVal = MakeArray(ByValString, numberOfStrings , lengthOfStrings, &stringArray); printf(stringArray\[1\]); free(stringArray);
}
I get bad dll calling convention. Please help!! Appreciate your help, ns
As I understood the description, you exporting some function from the C++ code (assuming from the way the name of the function is decorated). As the rules for formatting the name are not standardized in C++, it is allways a good idea to use old plain C exports (adding
extern "C"
keyword to the function declaration). Also you have to specify the calling convention when exporting function from DLL. If I am not wrong, it should be the__stdcall
for DLL exports. Next thingie - I guess, that the String type in VB is mapped to the BSTR in C/C++, not to the char directly, so I guess you have to change the declaration and be prepared for receiving the UNICODE strings. Hope this helps, but don't blame me if not ;P -
I have in my VB:
Call MyCString(myStringCopy, k, lengthOfStrings)
with:
Dim myStringCopy As String ' no fixed size
Dim k
Dim lengthOfStrings
Dim MyString(0 To 2) As StringMyString(0) = "a" MyString(0) = Left(MyString(0) & String(10, Chr(0)), 10) MyString(1) = "bbbb " MyString(1) = Left(MyString(1) & String(10, Chr(0)), 10) MyString(2) = "mmmm" MyString(2) = Left(MyString(2) & String(10, Chr(0)), 10) For i = 0 To 2 myStringCopy = myStringCopy + MyString(i) Next
=========== Public Declare Sub MyCString Lib "MyProj.dll" _ Alias "?MyCString@@YGXPAD@Z" (ByVal ByValString As String, numberOfStrings As Long, lengthOfStrings As Long) ==================== The C dll: i
nt MakeArray(char* ByValString, int numberOfStrings, int lengthOfStrings, char*** pStringArray)
{
int i;\*pStringArray = (char\*\*) malloc(numberOfStrings\*sizeof(char\*)); if (!(\*pStringArray)) return(1); for (i = 0 ; i < numberOfStrings ; i++) { (\*pStringArray)\[i\] = &(ByValString\[lengthOfStrings\*i\]); } return(0);
}
__declspec( dllexport ) void MyCString(char * ByValString,int numberOfStrings, int lengthOfStrings)
{
char** stringArray;rtnVal = MakeArray(ByValString, numberOfStrings , lengthOfStrings, &stringArray); printf(stringArray\[1\]); free(stringArray);
}
I get bad dll calling convention. Please help!! Appreciate your help, ns
Erm....haven't looked in any detail, but would guess the problem is caused by you declaring variables without specifying a type (Long int et). By default, in VB6 any typeless vars are VARIANTS - and your function needs longs....