Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problemas con una dll de c++ (https://www.clubdelphi.com/foros/showthread.php?t=59977)

liser 16-09-2008 13:10:35

Problemas con una dll de c++
 
Hola.
Me han pasado una libreria de hecha en c++ y cuando ejecuto la aplicación para acceder a ella me da un 'access violation'. El caso que este mismo codigo le funciona a la persona que realizo la libreria.

Este es el codigo
Código Delphi [-]

unit PruebaDLL;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
function funcionDePrueba(parametro1, nBytes : Integer): Integer;cdecl;


var
  Form1: TForm1;
  miArray : packed array [1..10] of Byte;

implementation

{$R *.dfm}
function funcionDePrueba(parametro1, nBytes : Integer):Integer;cdecl external 'MonitorLib.dll';


procedure TForm1.FormCreate(Sender: TObject);
begin
  funcionDePrueba(5, 20);
end;

end.

Tambien he probado con stdcall y nada.

¿Alguien sabe que me puede faltar? ¿Alguna idea?

Gracias.

Khronos 16-09-2008 13:48:44

Hola liser pues te falta lo más importante, el nombre de la función.
Sería así:

Código Delphi [-]
function funcionDePrueba(parametro1, nBytes : Integer):Integer;stdcall; external 'MonitorLib.dll' name 'funcionDePrueba';

implementation
...

Salu2

liser 16-09-2008 13:55:51

Muchas gracias Khronos pero eso tambien lo he provado, ten en cuenta que use 'cdecl' en vez de 'stdcall'.
Como yo comente, esto mismo le compila a la persona que realizo en la libreria en el mismo PC, creo que me debe faltar 'algo' externo al código, pero no se que es.

Crandel 16-09-2008 15:46:44

Como dice Khronos te falta el nombre de la funcion en la dll, que no es lo mismo que el nombre de tu funcion.

Prueba asi:

Código Delphi [-]

implementation

function funcionDePrueba; external 'MonitorLib.dll' name 'NombredeLaFuncion';

Observa que modifique la que esta en la implementacion

.

liser 16-09-2008 16:06:34

Probandolo como me dices me da el siguiente mensaje 'la aplicación no se ha podido iniciar correctamente'.
Lo he probado en Pc's que tienen instalado el visual studio y si que funciona perfectamente mi codigo original.

cHackAll 16-09-2008 16:11:33

Me imagino (aunque no lo puedo aceverar hasta ver la DLL), que requiera el framework o de otra libreria... que tal si subes la DLL para analizarla?

liser 16-09-2008 16:27:23

Desgraciadamente, necesito permiso para colgar la libreria, de todas maneras ahora mismo pruebo con el framework

Crandel 16-09-2008 18:04:27

Cita:

Empezado por liser (Mensaje 314364)
Probandolo como me dices me da el siguiente mensaje 'la aplicación no se ha podido iniciar correctamente'.
Lo he probado en Pc's que tienen instalado el visual studio y si que funciona perfectamente mi codigo original.

Por lo que dices, entonces el problema no es como la estas llamando, sino las dependencias de la libreria

liser 17-09-2008 07:52:20

1 Archivos Adjunto(s)
Nada, paso la libreria por si la podeis hechar un vistazo, es un rar dentro de un zip, por que se me pasaba un pelin de tamaño para subirla.

Crandel 17-09-2008 15:54:04

Por lo menos en mi maquina falta la dll dwmapi.dll.

No se en que habran compilado esa dll pero me parece que en una maquina con windows vista o XP actualizada con algun paquete nuevo (posiblemente service pack 3)

liser 17-09-2008 16:33:49

Gracias, algo es algo, ya intentare informarme. Cuando consiga algo lo digo

liser 23-09-2008 14:39:39

Bueno, después de mucho probar, cambiando en el compilador de c las opciones de linkado (eso es lo que me han dicho), funciono la dichosa librería, ahora me encuentro con otro problema.

La función que tomo de la librería

Código Delphi [-]
function monitorNotificarMensaje(Buffer: Array  of Byte ;
                                   nBytes: Word     ): integer;cdecl;
Cuando la llamo y le paso un valor (en este caso 2)

Código Delphi [-]
Numero:= monitorNotificarMensaje (MiArray,2);

Me devuelve siempre como si nBytes tuviera el valor 1.

También probé cambiado Word por Longword , integer, a ver si entendía algo.

¿Alguna ayuda?

cHackAll 24-09-2008 00:18:57

Habiendo seguido el hilo solo puedo asegurar que estas haciendo las cosas a ciegas, el que te dio la libreria deberia haberte dado tambien las declaraciones de los métodos exportados para que sepas como exportar dichos metodos de la forma correcta, me resulta muy heterodoxo que iteres en dichas declaraciones, asi no conseguiras grandes resultados.

Tambien deberias subir la nueva DLL compilada o lo que tengas pues asi como la dejaste en un anterior post no puedemos ayudarte facilmente.

Saludos

liser 24-09-2008 11:07:59

Pues he cambiado 'directiva de alineaióni' a {$A1} y me ha funcionado, pero no se realmente lo que he hecho. ¿Alguien me puede decir donde encontrar informacion sobre esto? No encuentro nada en el foro.

Gracias por todo

cHackAll 25-09-2008 00:53:49

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
 {$A1}if LoadLibrary('MonitorLib.dll') = 0 then
  MessageBox(0, 'Cómo ayudar si ni carga???', nil, 0);
end;


La franja horaria es GMT +2. Ahora son las 23:59:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi