How to dllimport in Microsoft Visual C++

后端 未结 3 1508
猫巷女王i
猫巷女王i 2020-12-18 04:44

I have a DLL and I would like to use some of its functions.

#include 

using namespace std;

extern \"C\" __declspec(dllimport) int Initializ         


        
相关标签:
3条回答
  • 2020-12-18 04:54

    From your phrasing it is pretty clear you are using Dev Studio some or other version.

    In order to implicitly link against a dll, VC++ needs a .lib file, no questions. Without a .lib you can only explicitly load the dll using LoadLibrary and GetProcAddress.

    Fortunately import libraries contain nothing other than the dll's exported symbols, so it is perfectly legitimate to simply create a dll project in VC++ that exports the identical symbols, build it, and then use the resulting .lib file to access the target dll.

    The trick really is, getting the symbols right: Depending on how the original dll was created there might be some decoration to deal with.

    "Initialize" could be exported from a dll in several ways when viewed with dependencywalker

    • "Initialize" - was either exported via a .DEF file, or via extern "C" __declspec(dllexport) int __cdecl Initialize(...
    • "_Initalize@16" - was exported using: extern "C" __declspec(dllexport) int __stdcall Initialize(...
    • ?Initialize@@YAHPADOH@Z" - `__declspec(dllexport) int Initialize(char*,char*,int);
    • ?Initialize@@YGHPADOH@Z" - `__declspec(dllexport) int __stdcall Initialize(char*,char*,int);

    The problem really is the first case - if the calling convention isn't __cdecl (and most dll api's are actually __stdcall - all windows dlls are __stdcall) then you must use a .def file to export the undecorated names.

    0 讨论(0)
  • 2020-12-18 05:15

    Under visual studio you can't link directly to DLL, you need import library.

    So basically you have several options:

    1. Create import library form dll and link to it. There are some tools coming with MinGW that do the job, they may actually work for you, AFAIK there are also some tools for MSVC.

      This can be helpful: http://support.microsoft.com/kb/131313, not tested myself

    2. Use GetProcAddress
    3. Use gcc as it know to link directly with DLL's without import library :-)
    0 讨论(0)
  • 2020-12-18 05:19

    A good way would be to reconstruct some header that would declare the functions you want to call. For doing this, you must know/discover their exact signatures.

    If you have access to the strings command (available in cygwin), you might run it against the DLL. It will list the sequences of more than 4 consecutive printable characters terminated by a 0 (observe that it is really easy to implement, in the case where you do not want to install cygwin). Among these "strings", you will have garbage and the function signatures, mangled by the C++ compiler (see: http://en.wikipedia.org/wiki/Name_mangling). You will then have to unmangle the ones you are interested in, using undname.exe (assuming the DLL was built by Microsoft Visual; see: http://msdn.microsoft.com/en-us/library/5x49w699.aspx)

    ... You might also want to consider DependencyWalker.

    0 讨论(0)
提交回复
热议问题