Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-10-2007
mauqu mauqu is offline
Miembro
 
Registrado: may 2007
Posts: 28
Poder: 0
mauqu Va por buen camino
llamada a una funcion dentro de una dll

Estimado.

Desarrolle una dll con delphi con una función exportada, y la uso desde una aplicación desarrollada también en delphi y todo anda perfecto, pero cuando quiero usar esa misma función con otro lenguaje de programación, por ejemplo c++ me sale el siguiente error luego de que se llama a la función de mi dll

"argumentos incorrectos, o en conflicto con otros.", cuando le doy aceptar a este mensaje la función de la dll se ejecuta perfectamente.

por que puede ser esto ???, ahí les paso el código que desarrolle.

Código Delphi [-]
 
library Interfaz;
 
uses
  SysUtils,
  Classes,
  Dialogs,
  ActiveX,
  dNegocios in 'dNegocios.pas' {dmNegocios: TDataModule},
  fTester in 'fTester.pas' {frmTester};
{$R *.res}
var
  MProc: procedure(Respuesta:integer);
 
procedure Inicializar;
begin 
  CoInitialize(nil);
  if not assigned(dmNegocios) then
    dmNegocios:=TdmNegocios.Create(nil); 
  if not assigned(frmTester) then
    frmTester:=TfrmTester.Create(nil);
end;
 
procedure Terminar;
begin
  freeandnil(dmNegocios);
  freeandnil(frmTester);
end;
 
function Testear(Value:integer):integer; StdCall;
begin
  Result:=0;
  Inicializar;
  frmTester.ShowModal;
  Terminar;
end;
 
exports
  Testear name 'Testear';
 
begin

end.
Responder Con Cita
  #2  
Antiguo 16-10-2007
mensana mensana is offline
Miembro
 
Registrado: sep 2006
Posts: 69
Poder: 18
mensana Va por buen camino
Cita:
Empezado por mauqu Ver Mensaje
... pero cuando quiero usar esa misma función con otro lenguaje de programación, por ejemplo c++
Quizá el problema está en la definición de la interface en C++ (el fichero .h)
, como la has definido ?
Responder Con Cita
  #3  
Antiguo 16-10-2007
mauqu mauqu is offline
Miembro
 
Registrado: may 2007
Posts: 28
Poder: 0
mauqu Va por buen camino
El tema es este, quiero crear una dll que despues la pueda usar con cualquier lenguaje o programa que trabaje con dll.

Probe con c++ de la siguiente manera

Código Delphi [-]
 
#include  
#include  
 
typedef int (__pascal *MYPROC)(int); 
 
int main(VOID) 
{ 
    int i;
    HINSTANCE hinstLib; 
    MYPROC ProcAdd; 
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
 
    // handle de la DLL.
 
    hinstLib = LoadLibrary(TEXT("InterfazVisualLab.dll")); 
 
    
    if (hinstLib != NULL) 
    { 
        ProcAdd = (MYPROC) GetProcAddress(hinstLib, "Testear"); 
 
        
        if (NULL != ProcAdd) 
        {
            fRunTimeLinkSuccess = TRUE;
            i=(ProcAdd) (0); 
        }
 
        
        fFreeResult = FreeLibrary(hinstLib); 
    } 
 
    
    if (! fRunTimeLinkSuccess) 
        printf("Message printed from executable\n"); 
    return 0;
}

probe con visual basic de la siguiente manera:

Código Delphi [-]
 
Private Declare Function Testear Lib "InterfazVisualLab.dll" (ByVal a As Integer) As Integer
 
Private Sub Command1_Click()
    Testear (0)
End Sub

En los dos casos me da error :S
Responder Con Cita
  #4  
Antiguo 16-10-2007
mensana mensana is offline
Miembro
 
Registrado: sep 2006
Posts: 69
Poder: 18
mensana Va por buen camino
Cita:
Empezado por mauqu Ver Mensaje
typedef int (__pascal *MYPROC)(int);
En Delphi le indicaste que era stdcall, en C++ también.

Prueba con la convención de llamada stdcall, o sus variantes según compilador, _stdcall o __stdcall (doble subrayado!)
Responder Con Cita
  #5  
Antiguo 16-10-2007
Avatar de aeff
aeff aeff is offline
Miembro
 
Registrado: oct 2006
Ubicación: Cuba, Guantánamo
Posts: 348
Poder: 18
aeff Va camino a la fama
Saludos, mira mi versión:

Código de la DLL
Código Delphi [-]
library MyDll;

uses
  SysUtils,
  Windows,
  Classes,
  ActiveX,
  fTestear in 'fTestear.pas' {frmTestear};

{$R *.RES}

procedure Inicializar();
begin
  CoInitialize(nil);
end;

procedure Testear(Value: Integer); stdcall;
begin
  Inicializar();
  if not Assigned(frmTestear) then
    frmTestear := TfrmTestear.Create(nil);
  frmTestear.Caption := IntToStr(Value);
  frmTestear.ShowModal;
  frmTestear.Release;
end;

  exports Testear;
end.



Ahora, en el codigo C++ esta es mi version, no esta muy arregalda para contrarrestar excepciones pero creo que eso debes saberlo hacer:

Código:
//---------------------------------------------------------------------------

#pragma hdrstop

#include "Windows.hpp"
#include "Classes.hpp"
//---------------------------------------------------------------------------

#pragma argsused

  typedef int (__stdcall *TTestear)(int Value);

void main()
{
  int DllHinst;
  DllHinst = (int)LoadLibrary("E:/TitOSoft/Inventando/Dll/MyDll.dll");
  TTestear Testear;
  Testear = (TTestear)GetProcAddress((int*)DllHinst, "Testear");
  Testear(55);
}
//---------------------------------------------------------------------------


Espero que entiendas lo que hice,


Saludos
Aeff!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Llamada a Procedimiento Almacenado desde dentro de un Thread MontarazAE MS SQL Server 2 29-05-2007 17:46:34
Llamada a una funcion que incluye en el nombre una variable papulo PHP 11 28-12-2005 16:38:19
TQuery dentro de una funcion Function jorgito Varios 4 26-09-2005 15:44:57
¿Como defino la llamada a una funcion en la Unit Principal Antuan Varios 2 14-08-2005 16:09:32
Crear query dentro de unit y funcion? alehillebrand OOP 3 19-07-2005 00:56:59


La franja horaria es GMT +2. Ahora son las 04:43:36.


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
Copyright 1996-2007 Club Delphi