From: Audiodev <aud...@in...> - 2006-07-19 15:23:39
|
Hi everybody, I have the following problem: I have a DLL which I have compiled with MSVC. This DLL uses a C-function=20 to obtain a pointer to base interface class. The application loads the DLL (LoadLibrary) and then loads the symbol of=20 the C-entry function (GetProcAddress). I can see in the devc++ environment debugger that both function calls=20 succede. Next I call the C-function which I have returned in the call to=20 GetProcAddress. At this moment the application crashes with an access violation. The question now: Is there a chance to load C functions dynamically from=20 an MSVC DLL the way I did it? Is there something special that I have to consider with respect to=20 calling convention? The following is a sequence of win32 API function calls as they lead to=20 the access violation: typedef void* (*openTechnology)( void ); #define OPENTECHNOLOGY "initTechnology" bool loadDLL() { // Define used variables HMODULE dllHandle; std::string nameDll =3D "libLoad.dll"; void* wavDev; //=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D // Load the DLL: Returns successfully! dllHandle =3D LoadLibrary(nameDll.c_str()); if(dllHandle =3D=3D NULL) { std::cout << "Unable to load DLL " << nameDll << std::endl; return(false); } openTechnology openFunc; //=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D // Load the symbol for C entry function: returns successfully openFunc =3D (openTechnology)GetProcAddress( dllHandle, OPENTECHNOLOGY= ); if(!openFunc) { std::cout <<"Could not find entry point to Component Object."; return(false); } //=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D // Use the returned function symbol to call the C-entry-function:=20 ---> FAILS (access violation) wavDev =3D openFunc(); ....... } Any help is greatly appreciated, best regards, Hauke Kr=FCger |
From: Michael G. <mg...@te...> - 2006-07-20 08:52:04
|
> The question now: Is there a chance to load C functions dynamically from= =20 > an MSVC DLL the way I did it? Yes (I'm doing it all the time). > Is there something special that I have to consider with respect to=20 > calling convention? Definitely !!! Your function ptr used to store the loaded function addr needs to be declared the same as the function loaded. You basically have to copy the declaration from the header file. > typedef void* (*openTechnology)( void ); This implies openTechnology is a cdecl function pointer. > #define OPENTECHNOLOGY "initTechnology" [snip] > openFunc =3D (openTechnology)GetProcAddress( dllHandle, OPENTECHNOLOGY= ); How is initTechnology defined ? HTH, best, Michael =2D-=20 Vote against SPAM - see http://www.politik-digital.de/spam/ Michael Gerdau email: mg...@te... GPG-keys available on request or at public keyserver |
From: Audiodev <aud...@in...> - 2006-07-21 09:14:49
|
Hi Michael, thank you for the response! I have managed to get my MSVC Dlls working with devcpp. The reason why this did not work was that I use C-entry functions but then C++-interface member functions with an object pointer reference. These C++ member functions must be of calling convention type __stdcall. With this, everything seems to be fine! Best Regards, Hauke Michael Gerdau wrote: >>The question now: Is there a chance to load C functions dynamically from >>an MSVC DLL the way I did it? >> >> > >Yes (I'm doing it all the time). > > > >>Is there something special that I have to consider with respect to >>calling convention? >> >> > >Definitely !!! > >Your function ptr used to store the loaded function addr needs to be >declared the same as the function loaded. You basically have to copy >the declaration from the header file. > > > >>typedef void* (*openTechnology)( void ); >> >> > >This implies openTechnology is a cdecl function pointer. > > > >>#define OPENTECHNOLOGY "initTechnology" >> >> >[snip] > > >> openFunc = (openTechnology)GetProcAddress( dllHandle, OPENTECHNOLOGY ); >> >> > >How is initTechnology defined ? > >HTH, best, >Michael > > >------------------------------------------------------------------------ > >------------------------------------------------------------------------- >Take Surveys. Earn Cash. Influence the Future of IT >Join SourceForge.net's Techsay panel and you'll get the chance to share your >opinions on IT & business topics through brief surveys -- and earn cash >http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV > >------------------------------------------------------------------------ > >_______________________________________________ >MinGW-users mailing list >Min...@li... > >You may change your MinGW Account Options or unsubscribe at: >https://lists.sourceforge.net/lists/listinfo/mingw-users > > |
From: Hugo L. <hug...@gm...> - 2006-07-26 13:09:28
|
Hi, I have been trying to get mingw dll's to work with msvc and vice versa and haven't been successful yet. I'm using the same approach that Hauke was using - The DLL uses a C-function to obtain a pointer to base interface class. The application loads the DLL (LoadLibrary) and then loads the symbol of the C-entry function (GetProcAddress). It works without problems when the dll and app has been compiled with mingw. It also works to an extent when using heterogenous compilers, all of the following functions work fine. void printHello(){cout<<"hello";} int getInt() {return 5;} int getInt() { int i = 5; return i; } However if the function returns class data, as in the following example, it does not work. class Service { int i; service() { i=5; } int getInt() { return i;} }; int main() { char* lib = "NeoseraTestLibrary.dll"; void* powerLibrary = LoadSharedLibrary(lib ); create_service* createService = (create_service*) GetProcAddress( powerLibrary, "exportCreateService"); ServiceInterface* s = createService(); cout << s->getString() << endl; } The correct output (as produced by homogenous dll app combo) is 5 When trying to load mingw dll from msvc app the output is 279528 Does anyone have any insights? Many Thanks, Hugo On 7/21/06, Audiodev <aud...@in...> wrote: > Hi Michael, > > thank you for the response! > > I have managed to get my MSVC Dlls working with devcpp. > The reason why this did not work was that I use C-entry functions but then > C++-interface member functions with an object pointer reference. These > C++ member functions must be > of calling convention type __stdcall. With this, everything seems to be > fine! > > Best Regards, > Hauke > > Michael Gerdau wrote: > > >>The question now: Is there a chance to load C functions dynamically from > >>an MSVC DLL the way I did it? > >> > >> > > > >Yes (I'm doing it all the time). > > > > > > > >>Is there something special that I have to consider with respect to > >>calling convention? > >> > >> > > > >Definitely !!! > > > >Your function ptr used to store the loaded function addr needs to be > >declared the same as the function loaded. You basically have to copy > >the declaration from the header file. > > > > > > > >>typedef void* (*openTechnology)( void ); > >> > >> > > > >This implies openTechnology is a cdecl function pointer. > > > > > > > >>#define OPENTECHNOLOGY "initTechnology" > >> > >> > >[snip] > > > > > >> openFunc = (openTechnology)GetProcAddress( dllHandle, OPENTECHNOLOGY ); > >> > >> > > > >How is initTechnology defined ? > > > >HTH, best, > >Michael > > > > > >------------------------------------------------------------------------ > > > >------------------------------------------------------------------------- > >Take Surveys. Earn Cash. Influence the Future of IT > >Join SourceForge.net's Techsay panel and you'll get the chance to share your > >opinions on IT & business topics through brief surveys -- and earn cash > >http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV > > > >------------------------------------------------------------------------ > > > >_______________________________________________ > >MinGW-users mailing list > >Min...@li... > > > >You may change your MinGW Account Options or unsubscribe at: > >https://lists.sourceforge.net/lists/listinfo/mingw-users > > > > > > > ------------------------------------------------------------------------- > Take Surveys. Earn Cash. Influence the Future of IT > Join SourceForge.net's Techsay panel and you'll get the chance to share your > opinions on IT & business topics through brief surveys -- and earn cash > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV > _______________________________________________ > MinGW-users mailing list > Min...@li... > > You may change your MinGW Account Options or unsubscribe at: > https://lists.sourceforge.net/lists/listinfo/mingw-users > -- ******************************************* This document is strictly confidential and is intended for use by the addressee unless otherwise indicated. ******************************************* |
From: Greg C. <chi...@co...> - 2006-07-27 15:57:54
|
On 2006-7-26 13:09 UTC, Hugo Leeney wrote: > > I have been trying to get mingw dll's to work with msvc and vice versa [...] > It works without problems when the dll and app has been compiled with > mingw. It also works to an extent when using heterogenous compilers, > all of the following functions work fine. > void printHello(){cout<<"hello";} > int getInt() {return 5;} > int getInt() { int i = 5; return i; } > > However if the function returns class data, as in the following > example, it does not work. Have you read the answer to this question: Why can't I mix objects from different compiler brands or mix objects from different compiler versions of the same compiler brands? in the MinGW wiki? |
From: Tuomo L. <dj...@mb...> - 2006-07-27 21:25:57
|
Hugo Leeney wrote: > The correct output (as produced by homogenous dll app combo) is > 5 > When trying to load mingw dll from msvc app the output is > 279528 > > Does anyone have any insights? You mean apart from the fact that C++ implementations are not compatible - regardless of how you get the object? http://www.mingw.org/MinGWiki/index.php/MixObjects -- Tuomo ... 5. It is always possible to aglutenate multiple separate problems into a single complex interdependent solution. In most cases this is a bad idea. -- RFC 1925, The Twelve Networking Truths |
From: Hugo L. <hug...@gm...> - 2006-07-28 21:47:00
|
Code correction below: > However if the function returns class data, as in the following > example, it does not work. > class Service { > int i; > service() { > i=5; > } > int getInt() { return i;} > }; > > int main() { > char* lib = "NeoseraTestLibrary.dll"; > void* powerLibrary = LoadSharedLibrary(lib ); > create_service* createService = (create_service*) GetProcAddress( > powerLibrary, "exportCreateService"); > ServiceInterface* s = createService(); > cout << s->getInt() << endl; //correction here > } I tried to load a msvc dll from a mingw app and the program crashed when executing the last line. I have a make project set up that compiles and runs all mingw, msvc combinations. If anyone wants to see it let me know. The list rejected the attatchment (duh). Thanks Hugo |
From: Tuomo L. <dj...@mb...> - 2006-07-29 19:26:26
|
Hugo Leeney wrote: > I tried to load a msvc dll from a mingw app and the program crashed > when executing the last line. Yes, that is to be expected. Clearly you have not read the responses to your message. Please, do read this one. Unlike with C, using C++ across different compilers is pretty much *never* supported - ehatever the combination. The binary interface, as well as the name mangling scheme, is different with regard to GCC vs. MSVC. That's pretty much what it says in the page I provided the link to. I suppose that could be written in plainer English in the FAQ. The problem is that the object is created in the DLL (with MSVC conventions). This would not be a problem if you only passed it back to the functions in the DLL. Instead you are trying to use it in an executable created by MinGW (GCC) and that does not, and will not, work. -- Tuomo ... Can you find the mispelled word in hear? |
From: Tuomo L. <dj...@mb...> - 2006-07-29 19:50:12
|
Tuomo Latto wrote: >>I tried to load a msvc dll from a mingw app and the program crashed >>when executing the last line. > > Yes, that is to be expected. > Clearly you have not read the responses to your message. > Please, do read this one. > > Unlike with C, using C++ across different compilers is pretty much *never* > supported - ehatever the combination. The binary interface, as well as the name > mangling scheme, is different with regard to GCC vs. MSVC. > That's pretty much what it says in the page I provided the link to. > I suppose that could be written in plainer English in the FAQ. > > The problem is that the object is created in the DLL (with MSVC conventions). > This would not be a problem if you only passed it back to the functions in the > DLL. Instead you are trying to use it in an executable created by MinGW (GCC) > and that does not, and will not, work. That said, I would think that any workaround *that actually works* to the situation are welcome. Why not put a minimal example (with an appropriate disclaimer) to the Wiki? (I assume Keith or Earnie will voice out their objections, as well as make me wish I was never born, if they feel it is inappropriate. And yes, I would insert a smiley here if didn't object to using them..) -- Tuomo ... Python is executable pseudocode. Perl is executable line noise. Which is why I love it. |
From: Keith M. <kei...@to...> - 2006-07-31 09:09:05
|
Tuomo Latto wrote: > Unlike with C, using C++ across different compilers is pretty much > *never* supported - ehatever the combination. The binary interface, > as well as the name mangling scheme, is different with regard to > GCC vs. MSVC. That's pretty much what it says in the page I > provided the link to. I suppose that could be written in plainer > English in the FAQ. > > The problem is that the object is created in the DLL (with MSVC > conventions). This would not be a problem if you only passed it > back to the functions in the DLL. Instead you are trying to use > it in an executable created by MinGW (GCC) and that does not, > and will not, work. > > That said, I would think that any workaround *that actually works* > to the situation are welcome. > > Why not put a minimal example (with an appropriate disclaimer) to > the Wiki? If think you know of a way to make it work, feel free to contribute it; the Wiki relies on *your* contributions. > (I assume Keith or Earnie will voice out their objections, as well > as make me wish I was never born, if they feel it is inappropriate. You may wish you had never been born, when I invite you to handle all the questions, if it turns out that your method isn't as robust as you thought it was. :-) > And yes, I would insert a smiley here if didn't object to using > them..) And I deliberately threw one in there. I tend to use them sparingly, but I'm too lazy to type such explanations in their stead. Regards, Keith. |