Call function in c++ dll without header

24,958

Solution 1

If the function is a C++ one, you may be able to derive the function signature from the mangled name. Dependency Walker is one tool that will do this for you. However, if the DLL was created with C linkage (Dependency Walker will tell you this), then you are out of luck.

Solution 2

The C++ language does not know anything about dlls.

Is this on Windows? One way would be to:

  • open the dll up in depends.exe shipped with (Visual Studio)
  • verify the signature of the function you want to call
  • use LoadLibrary() to get load this dll (be careful about the path)
  • use GetProcAddress() to get a pointer to the function you want to call
  • use this pointer-to-function to make a call with valid arguments
  • use FreeLibrary() to release the handle

BTW: This method is also commonly referred to as runtime dynamic linking as opposed to compile-time dynamic linking where you compile your sources with the associated lib file.

There exists some similar mechanism for *nixes with dlopen, but my memory starts to fail after that. Something called objdump or nm should get you started with inspecting the function(s).

Solution 3

As you have found, the exports list in a DLL only stores names, not signatures. If your DLL exports C functions, you will probably have to disassemble and reverse engineer the functions to determine method signatures. However, C++ encodes the method signature in the export name. This process of combining the method name and signature is called "name mangling". This Stackoverflow question has a reference for determining the method signature from the mangled export name.

Try the free "Dependency Walker" (a.k.a. "depends") utility. The "Undecorate C++ Functions" option should determine the signature of a C++ method.

Solution 4

If you indeed know or strongly suspect the function is there, you can dynamically load the DLL with loadLibrary and get a pointer to the function with getProcAddress. See MSDN

Note that this is a manual, dynamic way to load the library; you'll still have to know the correct function signature to map to the function pointer in order to use it. AFAIK there is no way to use the dll in a load-time capability and use the functions without a header file.

Solution 5

Calling non-external functions is a great way to have your program break whenever the 3rd party DLL is updated.

That said, the undname utility may also be helpful.

Share:
24,958
mileschet
Author by

mileschet

Updated on August 14, 2020

Comments

  • mileschet
    mileschet almost 4 years

    I would like to call a method from an dll, but i don't have the source neither the header file. I tried to use the dumpbin /exports to see the name of the method, but i can found the methods signature?

    Is there any way to call this method?

    Thanks,