FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#1
|
|||
|
|||
Error en DLL
Tengo una DLL en SYSTEM32 y en ella la siguiente función:
{ Abre una ventana con un objeto TEDIT para un proceso de búsqueda } function buscarValor( var devuelto : string; {guarda la cadena de búsqueda} caracteres : integer; {máximo de caracteres para el objeto TEDIT} mayusculas : boolean {si sólo se admite la edición en mayúsculas} ):boolean; stdcall; export; {TRUE: si se ha aceptada y escrito texto en TEDI} Ésta es la rutina escrita en la DLL FBuscar := TFBuscar.create(nil); try with FBuscar do begin edit1.maxLength := caracteres; if mayusculas then edit1.charCase := ecUpperCase else edit1.charCase := ecNormal; result := showModal = mrok; if result then devuelto := edit1.text; end; finally FBuscar.free; end; En el FORM de la aplicación que hace la llamada: type TLlamarDLL = function (var s : string; x : integer; m : boolean) : boolean; var DLL : HWND; LlamarDLL : TLLamarDLL; s : string; begin DLL := loadLibray('MONLIB.DLL'); if DLL > 0 then try @LlamarDLL := getProcAddress(DLL, 'buscarValor'); if @LlamarDLL <> nil then if llamarDLL(s, 50, True) then edit1.text := s; finally FreeLibrary(DLL); end; end; Pues bien. Si el resultado es FALSE (he pulsado en la ventana que se abre con la función el botón CANCELAR) no me da error. En cambio, si el resultado de la función es TRUE (he pulsado ACEPTAR y además he escrito texto) se me da el error: EAccessViolation ¿Dónde puede estar el error? |
#2
|
||||
|
||||
Bueno, le dí un vistazo rápido al código y me parece que hay dos posibles fallas, sin embargo me inclino a una de ellas… prueba el siguiente código y no dejes de contarnos como te va:
|
#3
|
|||
|
|||
Gracias, "chackAll" por la respuesta. Desgraciadamente me sigue dando el mismo error (EAccessViolation); ¿cuál es la segunda posibilidad?
Gracias de nuevo por tu respuesta. |
#4
|
||||
|
||||
Vaya, en ves de string; declara ShortString o PChar en la librería y en el proyecto que lo llama (en el proyecto original)...
Cita:
Si ésto no dá aconsejo subas parte del cógido (mínimo funcional) para corregirlo. |
#5
|
|||
|
|||
Gracias de nuevo, CheckAll. No creo que sea un problema de tipos (string, pchar).
He depurado paso a paso el código y he inspecionado las variables. El error (EAccessViolation) se produce en "FreeLibrary" procedure TForm1.SpeedButton1Click(Sender: TObject); type TLlamarDLL = function(var s : string; x : integer; si : boolean): boolean; var buffer : string; DLL : HWND; LlamarDLL : TLlamarDLL; begin buffer := ''; DLL := LoadLibrary('monlib.dll'); try @LlamarDLL := GetProcAddress(DLL, 'buscarValor'); if @LlamarDLL <> nil then if llamarDLL(buffer, 30, false) then edit1.text := buffer; finally FreeLibrary(DLL); end; end; |
#6
|
|||
|
|||
Prueba cambiando el tipo de la variable DLL.
DLL : HWND; -----> DLL : THandle; Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Error Abstract Error y Access violation | zvf | OOP | 33 | 08-09-2010 18:50:33 |
'DBX Error: No Mapping for Error Code Found' | CHECHE81 | Conexión con bases de datos | 1 | 09-06-2010 02:11:35 |
Error 10093 al ver un informe - Que error es este? | URBANO | Impresión | 1 | 03-02-2006 18:44:39 |
¿Por qué me da este error?Error creating cursor manejador | nuri | SQL | 2 | 01-08-2005 17:30:28 |
Error: RichEdit line insertation error | DarkByte | Varios | 3 | 19-07-2004 12:28:09 |
|