Ver Mensaje Individual
  #2  
Antiguo 26-05-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
erickperez6,

Cita:
Empezado por erickperez6
...Tengo una DLL...en vb6 funciona bien...siempre que mando un mensaje en blanco obtengo un error en la version delphi, pero nunca en la vb6...
Código:
' Declaración de la llamada a la DLL en VB6
Private Declare Function AddMessageField Lib "efProtocol.dll" (ByVal szField As String, ByVal lFieldLength As Long) As Long
Te comento:

1- En VB6 cuando una función envía un String por Valor a un DLL (ByVal), lo esta enviando como un String terminado en Nulo.

2- El tipo de dato Long en VB6 es equivalente a Integer en Delphi (Win32).

3- En el ejemplo en VB6 la función llamada en el DLL se denomina AddMessageField no SendSerialMessage, lo cual parece ser una incongruencia en el ejemplo en Delphi mostrado en el Msg #1.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TAddMessageField = function (szField : PChar; lFieldLength : Integer) : Integer; Stdcall;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  dllHandle : Cardinal;
  AddMessageField : TAddMessageField;

procedure CargarDll;
begin
   dllHandle := LoadLibrary('EFProtocol.dll') ;
   if dllHandle <> 0 then
      @AddMessageField := GetProcAddress(dllHandle, 'AddMessageField')
   else
      MessageDlg('La Librería EFProtocol.dll No Fue Cargada',mtError,[mbYes],0);
end;

function AddCampo(Texto : String) : longint;
begin
   if Assigned(AddMessageField) then
   begin
      if AddMessageField(PChar(Texto), Length(Texto)) <> 0 Then;
         raise Exception.Create('Error en un Mensaje: ' + IntToStr(result));
   end
   else
      MessageDlg('La Función AddMessageField No Fue Encontrada',mtError,[mbYes],0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   DataSerialPort : String;

begin

   DataSerialPort := 'Texto a Enviar al Puerto Serial';

   CargarDLL;

   AddCampo(DataSerialPort);
   AddCampo('');

   FreeLibrary(dllHandle);

end;

end.
El código anterior carga una DLL de forma dinámica para el envío de datos a un puerto serial tomando en consideración los puntos señalados anteriormente en función del problema planteado.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 26-05-2013 a las 21:26:37.
Responder Con Cita