Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. Visual Basic
  4. bad dll calling convrention

bad dll calling convrention

Scheduled Pinned Locked Moved Visual Basic
helpquestion
3 Posts 3 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • N Offline
    N Offline
    ns
    wrote on last edited by
    #1

    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 String

    MyString(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

    G R 2 Replies Last reply
    0
    • N 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 String

      MyString(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

      G Offline
      G Offline
      geo_m
      wrote on last edited by
      #2

      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

      1 Reply Last reply
      0
      • N 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 String

        MyString(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

        R Offline
        R Offline
        RichardGrimmer
        wrote on last edited by
        #3

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

        1 Reply Last reply
        0
        Reply
        • Reply as topic
        Log in to reply
        • Oldest to Newest
        • Newest to Oldest
        • Most Votes


        • Login

        • Don't have an account? Register

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • World
        • Users
        • Groups