digitalmars.D - Extern function inside a class?
- Gilles G. (37/37) Jun 23 2007 Hello,
- Daniel Keep (11/51) Jun 23 2007 The problem with your second example is that it doesn't work, either.
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!
Jun 23 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
Jun 23 2007








Daniel Keep <daniel.keep.lists gmail.com>