Problema: .dll sin .h ni .lib en c++/cli

Iniciado por SARGE553413, 16 Julio 2014, 12:07 PM

0 Miembros y 1 Visitante están viendo este tema.

SARGE553413

Hola a todos.

Tengo que desarrollar un programa para controlar una cámara que se comunica con el PC mediante un puerto FrameLink. Para ello la cámara trae un .dll para poder trabajar con este puerto. Sin embargo no trae ni .h, ni .lib, ni documentación ni nada.

Mi pregunta es primero, como poder usarla desde un proyecto de c++/cli en visual studio.

Saludos.


PD. : La otra pregunta es si dentro del .dll puede haber algo que me ayude a saber que métodos hay y como usarlos

Eleкtro

#1
Hola

Mi experiencia con C++ es practicamente nula, pero creo que te puedo ayudar un poco, dentro de lo que cabe.

Cita de: SARGE553413 en 16 Julio 2014, 12:07 PMcomo poder usarla desde un proyecto de c++/cli en visual studio.

Parece que sin el ".lib" es complicado, pero posible:
· http://stackoverflow.com/questions/495795/how-do-i-use-a-third-party-dll-in-visual-studio-c

Cita de: SARGE553413 en 16 Julio 2014, 12:07 PMLa otra pregunta es si dentro del .dll puede haber algo que me ayude a saber que métodos hay y como usarlos

Aquí tienes una solución en C# P/Invokeando la librería DbgHelp.dll para enumerar los símbolos, está genial :)

Cita de: http://stackoverflow.com/questions/18249566/c-sharp-get-the-list-of-unmanaged-c-dll-exports
Código (csharp) [Seleccionar]
[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SymInitialize(IntPtr hProcess, string UserSearchPath, [MarshalAs(UnmanagedType.Bool)]bool fInvadeProcess);

[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SymCleanup(IntPtr hProcess);

[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern ulong SymLoadModuleEx(IntPtr hProcess, IntPtr hFile,
     string ImageName, string ModuleName, long BaseOfDll, int DllSize, IntPtr Data, int Flags);

[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SymEnumerateSymbols64(IntPtr hProcess,
   ulong BaseOfDll, SymEnumerateSymbolsProc64 EnumSymbolsCallback, IntPtr UserContext);

public delegate bool SymEnumerateSymbolsProc64(string SymbolName,
      ulong SymbolAddress, uint SymbolSize, IntPtr UserContext);

public static bool EnumSyms(string name, ulong address, uint size, IntPtr context)
{
  Console.Out.WriteLine(name);
  return true;
}   

static void Main(string[] args)
{
  IntPtr hCurrentProcess = Process.GetCurrentProcess().Handle;

  ulong baseOfDll;
  bool status;

  // Initialize sym.
  // Please read the remarks on MSDN for the hProcess
  // parameter.
  status = SymInitialize(hCurrentProcess, null, false);

  if (status == false)
  {
    Console.Out.WriteLine("Failed to initialize sym.");
    return;
  }

  // Load dll.
  baseOfDll = SymLoadModuleEx(hCurrentProcess,
                              IntPtr.Zero,
                              "c:\\windows\\system32\\user32.dll",
                              null,
                              0,
                              0,
                              IntPtr.Zero,
                              0);

  if (baseOfDll == 0)
  {
    Console.Out.WriteLine("Failed to load module.");
    SymCleanup(hCurrentProcess);
    return;
  }

  // Enumerate symbols. For every symbol the
  // callback method EnumSyms is called.
  if (SymEnumerateSymbols64(hCurrentProcess,
      BaseOfDll, EnumSyms, IntPtr.Zero) == false)
  {
    Console.Out.WriteLine("Failed to enum symbols.");
  }

  // Cleanup.
  SymCleanup(hCurrentProcess);
}

Y aquí el resto de funciones que puedes usar en caso d enecesidad:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms679291%28v=vs.85%29.aspx

Y, por si fuera poco, con la GUI de DLL Export Viewer de Nirsoft puedes obtener tanto los nombres como las direcciones y otra info.



Saludos








SARGE553413

Muchas gracias, una respuesta muy completa.

Saludos.