Thread: C-function, don't load external dll file

C-function, don't load external dll file

From
Przemek Lisowski
Date:

I write my dll files in visual studio 2010.

The dll file (name fservice.dll), which has an external function, code write in c++ (VS2010, I have dll and lib files)

char * convert(char *)

I tested my fservice.dll in console application which called function in this dll. It was work fine. I have a problem when a write and tests in Postgrsql.

Dll file witch has c-function, who exports and imports to postgresql:

 

 

#include "postgres.h"
#include "fmgr.h" 
#include <windows.h>
#include <stdio.h>

typedef
char* (__cdecl *MYPROC)(char * value);

__declspec( dllexport ) PG_FUNCTION_INFO_V1(transform);

__declspec( dllexport ) Datum transform (PG_FUNCTION_ARGS)
{

HINSTANCE hinstLib
= LoadLibrary("fservice.dll");

char * pointer; text *t = PG_GETARG_TEXT_P(0);

if (hinstLib != NULL)
{
ProcAdd
= (MYPROC) GetProcAddress(hinstLib, "convert");
pointer=ProcAdd("text"); FreeLibrary(hinstLib);
}
else
PG_RETRUN_NULL();


 /* * code */


PG_RETURN_TEXT_P
(new_t);
}


I have a problem because, mod is doesn't exists. Path to dll file I check before write. Compile this c-function, and when i debug i saw it HINSTANCE hinstLib it wasn't created. It wasn't NULL or any value, It wasn't exist. Finally my c-function doesn't use my function form external dll.

How load dll and use my external function ?

My external function form dll and LoadLibrary() is not called by dll program with called by Postgresql, Why?

 

Przemek

 

 

 

 

I write my dll files in visual studio 2010.

The dll file (name fservice.dll), which has an external function, code write in c++ (VS2010, I have dll and lib files)

char * convert(char *)

Dll file witch has c-function, who exports and imports to postgresql:

typedef char* (__cdecl *MYPROC)(char * value); PG_FUNCTION_INFO_V1(transform); Datum transform (PG_FUNCTION_ARGS) { HINSTANCE hinstLib= LoadLibrary("fservice.dll"); char * pointer; text *t = PG_GETARG_TEXT_P(0); if (hinstLib != NULL) { ProcAdd = (MYPROC) GetProcAddress(hinstLib, "convert"); pointer=ProcAdd("text"); FreeLibrary(hinstLib); } /* * code */ PG_RETURN_TEXT_P(new_t); }

I have a problem because, mod is doesn't exists. Path to dll file I check before write. Compile this c-function, and when i debug i saw it HINSTANCE hinstLib it wasn't created. It wasn't NULL or any value, It wasn't exist. Finally my c-function doesn't use my function form external dll.

How load dll and use my external function ?

My external function form dll and LoadLibrary() is not called by dll program with called by Postgresql, Why?

Re: C-function, don't load external dll file

From
Dimitri Fontaine
Date:
Hi,

Przemek Lisowski <przemek@lisnet.info> writes:
> HOW LOAD DLL AND USE MY EXTERNAL
> FUNCTION ? 

You need to declare it in SQL, maybe like this:
 create function public.transform(text) returns text as '$libdir/fservice', 'transform' language C;

See also the LOAD command and the CREATE EXTENSION documentation for how
to organise testing and shipping of your code.

Regards,
-- 
Dimitri Fontaine
http://2ndQuadrant.fr     PostgreSQL : Expertise, Formation et Support



Re: C-function, don't load external dll file

From
pl65
Date:
<blockquote class="quote dark-border-color" style="border-left:2px solid #CCCCCC;padding:0 1em"><div class="quote
light-border-color"><divclass="quote-author" style="font-weight: bold;">Dimitri Fontaine-7 wrote</div><div
class="quote-message">You need to declare it in SQL, maybe like this: create function public.transform(text) returns
textas '$libdir/fservice', 'transform' language C; </div></div></blockquote><b>I'm afraid that I won't do it becouse
fservice.dllis writen in c++, but dll file which contains function transform (this function export to Postgresql) was
wrotein ANSI C. </b> Secondly, LOAD function in posttgresql libraries that are use of my all dependent dll? I think i
shoulduse: LOAD 'fservice.dll' But I don't know which dll load to use function or makros which called from windows.h
(HINSTANCE,LoadLibray(), GetProcAddress())? <br /><hr align="left" width="300" /> View this message in context: <a
href="http://postgresql.1045698.n5.nabble.com/C-function-don-t-load-external-dll-file-tp5732931p5733197.html">Re:
C-function,don't load external dll file</a><br /> Sent from the <a
href="http://postgresql.1045698.n5.nabble.com/PostgreSQL-hackers-f1928748.html">PostgreSQL- hackers mailing list
archive</a>at Nabble.com.<br />