www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - D to DLLS

reply firefly fssc.demon.co.uk writes:
Dear D Users

I have now managed to get a dll function called from D, however I get an access
violation when I actually make the call, I presume this is due to incorrect
calling conventions. The code I use at the moment is below, I have taken the
usual C approach in defining a typedef for the C function pointer, then
declaring a variable to that type. However, in D one cannot specify the calling
convention in the typedef. I assume therefore that this is not the way to do it.
An earlier poster gave an example of how he did it, but I didn't quite
understand the use of the alias keyword in the example.

Any suggestions, gratefully accepted!

Herbert Sauro

import std.c.stdio;
import std.c.windows.windows;

typedef int (* ptr_SBWCREATEMODULEIMPL) (char* ModuleName, char* DisplayName,
int SBWModuleManagementType, char* helpStr);

ptr_SBWCREATEMODULEIMPL SBWCreateModuleImpl;

int main ( char [] [] args ) {

HMODULE LibHandle;

printf ("Start Program\n");
LibHandle = LoadLibraryA ("sbw.dll\0");
printf ("LibHandle = %X\n", LibHandle);
SBWCreateModuleImpl = (ptr_SBWCREATEMODULEIMPL) GetProcAddress (LibHandle,
"SBWCreateModuleImpl\0");
printf ("SBWCreateModuleImpl Handle = %X\n", SBWCreateModuleImpl);

SBWCreateModuleImpl ((char *) "dsbw\0", (char*)"D language\0", 0, (char*)"\0");
getchar();
return 0;
}
May 03 2004
parent reply "Unknown W. Brackets" <unknown at.simplemachines.dot.org> writes:
firefly fssc.demon.co.uk wrote:
 Dear D Users
 
 I have now managed to get a dll function called from D, however I get an access
 violation when I actually make the call, I presume this is due to incorrect
 calling conventions. The code I use at the moment is below, I have taken the
 usual C approach in defining a typedef for the C function pointer, then
 declaring a variable to that type. However, in D one cannot specify the calling
 convention in the typedef. I assume therefore that this is not the way to do
it.
 An earlier poster gave an example of how he did it, but I didn't quite
 understand the use of the alias keyword in the example.
 
 Any suggestions, gratefully accepted!
 
 Herbert Sauro
 
 import std.c.stdio;
 import std.c.windows.windows;
 
 typedef int (* ptr_SBWCREATEMODULEIMPL) (char* ModuleName, char* DisplayName,
 int SBWModuleManagementType, char* helpStr);
 
 ptr_SBWCREATEMODULEIMPL SBWCreateModuleImpl;
 
 int main ( char [] [] args ) {
 
 HMODULE LibHandle;
 
 printf ("Start Program\n");
 LibHandle = LoadLibraryA ("sbw.dll\0");
 printf ("LibHandle = %X\n", LibHandle);
 SBWCreateModuleImpl = (ptr_SBWCREATEMODULEIMPL) GetProcAddress (LibHandle,
 "SBWCreateModuleImpl\0");
 printf ("SBWCreateModuleImpl Handle = %X\n", SBWCreateModuleImpl);
 
 SBWCreateModuleImpl ((char *) "dsbw\0", (char*)"D language\0", 0, (char*)"\0");
 getchar();
 return 0;
 }
 
 

Did you try using extern (C)? news://news.digitalmars.com:119/c76bn6$at5$1 digitaldaemon.com -[Unknown]
May 03 2004
parent reply firefly fssc.demon.co.uk writes:
Yes I did, it doesn't work because it appears I can't declare a function pointer
using extern (C) which is what I need to do when I call GetProcAddress.

Herbert

Did you try using extern (C)?

news://news.digitalmars.com:119/c76bn6$at5$1 digitaldaemon.com

-[Unknown]

May 03 2004
parent Mike Wynn <one_mad_alien hotmail.com> writes:
On Tue, 4 May 2004 06:54:06 +0000 (UTC), firefly fssc.demon.co.uk
wrote:

Yes I did, it doesn't work because it appears I can't declare a function pointer
using extern (C) which is what I need to do when I call GetProcAddress.

Herbert

Did you try using extern (C)?

news://news.digitalmars.com:119/c76bn6$at5$1 digitaldaemon.com

-[Unknown]


extern(Windows) works !! see the util8 dynloader/winmm lib on http://www.geocities.com/one_mad_alien/dcode/ I quite happily call timeGetTime from winmm.dll with explict loading (which is extern(Windows) ) extern(C) { alias int function (int, int) cfuncPtr; } should be the C equiv of typedef __cdecl int (*cfuncPtr)(int, int); (__cdecl might be in the wrong place I forget such things! but you know what I mean) then cfuncPtr func = cast(cfuncPtr)GetProcAddress( hmodule, "myfunc" ); int i = func(1, 2); should work ..... Mike.
May 06 2004