PDA

Ver la Versión Completa : Función Que No Me Funciona En Una Dll


MON___
18-04-2007, 21:03:43
Tenía un módulo con una función para mostrar en un objeto TLISTBOX los elementos de un TCOMBOBOX. La función requería como argumento una variable TSTRINGS. Pronto la cambié por una variable que enviase el HANDLE del TComboBox cuyos elementos mostraría en un TLISTBOX. Así, mediante el API de WINDOWS (sendMessage) podía sincronizar las dos listas.

Más adelante decidí incluir ese módulo en una librería DLL. La función de la librería recibía perfectamente el HANDLE del TComboBox (al menos el valor era mayor a 0), pero no se mostraban sus elementos; es más: el valor devuelto por "sendMessage(handle_comboBox, CB_GETCOUNT, 0, 0)" es siempre 0.

¿Dónde puede estar el error?

delphi.com.ar
18-04-2007, 21:16:02
Hice algo muy sencillo que funciona sin problemas:

library Project2;

uses
Windows, Messages;


function GetComboCount(Handle: HWND): DWORD; stdcall;
begin
Result := SendMessage(Handle, CB_GETCOUNT, 0, 0);
end;

exports
GetComboCount;

begin
end.


unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
ComboBox1: TComboBox;
procedure Button1Click(Sender: TObject);
private
public
end;

var
Form1: TForm1;

function GetComboCount(Handle: HWND): DWORD; stdcall;

implementation

{$R *.dfm}

function GetComboCount; external 'Project2.dll';


procedure TForm1.Button1Click(Sender: TObject);
begin
ComboBox1.Items.Add('Hi!');
ShowMessageFmt('Cantidad de Items: %d', [GetComboCount(ComboBox1.Handle)]);
end;

end.

Me surge una duda... ¿Cómo estas pasando el handle del combo?... ¿Lo estas guardando en una variable en la dll o lo haces para cada llamado?

Saludos!

MON___
18-04-2007, 21:22:21
En la FORM incluída en librería creé una propiedad (property idHandle) para guardar en ella el HANDLE del TComboBox enviado en la función.

Chris
21-04-2007, 01:20:25
Es muy sencillo enviar el número de elementos de una lista, lo difícil es enviar o recibir los elementos. Si solo quieres obtener el numero de elementos, simplemente puedes enviar el Combox1.items.count a una función que reciba el numero, sin necesidad de estar enviando mensajes de windows.

En teoría, dos controles no pueden tener el mismo Handle, así que no puedes asignar el mismo handle del combo del form al combo de la DLL. Lo que si podrías hacer es utilizar funciones "callback" para enviar los valores uno a uno. Con este método si es aceptable que utilices los mensajes de windows.