cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Calling a function in external dll

Former Member
0 Likes
1,504

Hi

I was trying to improve te speed of an application by offloading string manipulations to an external dll. I created a dll with two functions:

replace

fnstringreplace2

The fnstringreplace3 function just returns an int: 42. The replace function returns an int but accepts a string. in this string all '?' are replaced with a space. The declarations in C are as follows:


#ifdef STRINGREPLACE2_EXPORTS

#define STRINGREPLACE2_API __declspec(dllexport)

#else

#define STRINGREPLACE2_API __declspec(dllimport)

#endif

extern "C" STRINGREPLACE2_API int  replace(TCHAR * string);

extern "C" STRINGREPLACE2_API int  fnstringreplace2(void);

The code:


extern "C" STRINGREPLACE2_API int fnstringreplace2(void)

{

  return 42;

}

extern "C" STRINGREPLACE2_API int replace(TCHAR * string) {

  HRESULT res;

  size_t maximalStringSize=1024;

  size_t targetSize;

  res = StringCchLength(string,maximalStringSize,&targetSize);

  for(unsigned int i = 0;i < targetSize ;i++)

  {

  switch (string[i])

  {

  case '?':

  string[i]=' ';

  }

  }

       return 1;

}


The dll seems to work just fine. When I tried to use the dll in powerbuilder I can get the fnstringreplace2 function to work just fine but the replace function doesn't. IT says my arguments are invallid: see attachment.


My declarations in powerbuilder are:


FUNCTION int replace(ref string sayit) LIBRARY "stringreplace2.dll"

FUNCtION int fnstringreplace2() LIBRARY "stringreplace2.dll"

I tried also tried it with char* in the c++ code but this doesn't seem to make any difference.


Any help would be appreciated


Greetings


Vincent Mangelschots


View Entire Topic
Former Member
0 Likes

thx to Abdallah ELRHAZOUI for steering my in the right direction. When i changed the call method the functions got renamed in the dll. I didn't have a def file so powerbuilder couldn't find them. I renamed the declaration to the new functionnames (got them using dependency walker) and now it seem to work. Thank you all for helping.

Greetings

Former Member
0 Likes

That's called "name mageling".

However, you should make sure that the caller allocate and deallocate memory. Memory shouldn't be allocated by your *.dll and released from the process which uses your *.dll.

To follow this rule you will save a lot of time hunting down weird problems.

Here's a good explanation why:

c++ - Is it bad practice to allocate memory in a DLL and give a pointer to it to a client app? - Sta...