[Wine]How to : C++ DLLs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I remember seeing a message somewhere about C++ DLLs and wanting to implement them in Winelib. Well here is an idea that I use in Windows that works great:

Define your class in a common header (let's call it dll.hpp):

class DllClass {
 public:
   int somedata;
  virtual void member(int arg);
};

Define the DLL source with two exports:

#include <dll.hpp>
extern "C" __declspec(dllexport) DllClass *new_DllClass() {
 return new DllClass;
}
extern "C" __declspec(dllexport) void delete_DllClass(DllClass *x) {
 delete x;
}
void DllClass::member(int arg) {
 //do something with arg..
}

Then in your main source code just load the DLL, get the addr of new_DllClass and delete_DllClass to create and destroy classes of type DllClass. The members of the class must be 'virtual' so that the main source will call into the loaded DLL (otherwise it will not even compile).
Now that you only have two simple "C" style exports the SPEC file that Winelib uses will be easy to setup.
There will of course be an extra jmp because of the virtual table, but the benefits outway the cost.


Main Source:

#include <dll.hpp>
int main() {
 DllClass *(new_DllClass*)();   //func ptr to new_DllClass
 void (delete_DllClass*)(DllClass *);  //func ptr to delete_DllClass
 DllClass *myClass;
 LoadDLL();
 new_DllClass = GetProcAddress("new_DllClass");
 delete_DllClass = GetProcAddress("delete_DllClass");
 myClass = (*new_DllClass)();
 //use myClass here
 (*delete_DllClass)(myClass);
}

Hope this helps.

Peter Quiring

_______________________________________________
wine-users mailing list
wine-users@xxxxxxxxxx
http://www.winehq.org/mailman/listinfo/wine-users

[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux