Extern function inside a class?

Daniel Keep daniel.keep.lists at gmail.com
Sat Jun 23 22:04:31 PDT 2007



Gilles G. wrote:
> Hello,
> I am writing a DLL using D. Iwould like to group the functions that I export together in a class which would also keep the data.
> For example:
> class DllManager
> {
>         this(){}
>         ~this(){}
>         invariant int dllVersion 1;
>         MyObject[] objectList;
>         extern(Windows) int GetDllVersion() { return dllVersion;}
>         extern(Windows) int NewObject()
>         {
>                  objectList.length = objectList.length+1;
>                  return objectList.length;
>         }
> }
> But I wonder if this is possible, because there is no instance of the class DllManager available. What happens when the function NewObject is called by the main program?
> 
> I guess the good way to do this is:
> class DllManager
> {
>         this(){}
>         ~this(){}
>         invariant int dllVersion 1;
>         MyObject[] objectList;
>         int GetDllVersion() { return dllVersion;}
>         int NewObject()
>         {
>                  objectList.length = objectList.length+1;
>                  return objectList.length;
>         }
> }
> DllManager manager;
> extern(Windows) int GetDllVersion() {return manager.getDllVersion(); }
> extern(Windows) int NewObject() {return manager.NewObject();}
> 
> But it looks like I am forced to write all the external calls twice...
> 
> Anybody for a "cleaner" solution?
> Thanks!

The problem with your second example is that it doesn't work, either.
"DllManager manager;" does *NOT* create an instance of DllManager: it
simply defines a variable that can point to one.

The question is: why do you want to use a class?  I mean, classes aren't
required in D, and you can't export classes through DLLs, so using a
class doesn't gain you anything.

Judging from how you're using it, you could easily just not use a class
at all, and use globals.  Then you wouldn't need to wrap all the calls.
 It's not like using globals will cause the world to explode, or anything :)

	-- Daniel



More information about the Digitalmars-d mailing list