• Viernes 8 de Noviembre de 2024, 09:57

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - MON___

Páginas: [1]
1
C++ Builder / Re: Error "einvalidpointer"
« en: Miércoles 30 de Enero de 2008, 17:17 »
Perdona por la tardanza en responderte. Acabo de probar a hacer la llamada desde una aplicación en C++ y  :angry: también me da error

ESTE ES EL CÓDIGO DE LA LLAMADA
Código: Text
  1.  
  2. typedef bool (__stdcall *MIDLL) (char *buffer);
  3.  
  4. __fastcall TForm1::TForm1(TComponent* Owner)
  5.         : TForm(Owner)
  6. {
  7. }
  8. //---------------------------------------------------------------------------
  9. void __fastcall TForm1::Button1Click(TObject *Sender)
  10. {
  11.         HINSTANCE dll;
  12.         MIDLL LlamarDLL;
  13.         dll = LoadLibrary("LIBRERIA.DLL");
  14.         if(dll){
  15.           LlamarDLL = (MIDLL)GetProcAddress(dll, "SeleccionarValores");
  16.           if (LlamarDLL){
  17.             char *buffer;
  18.             bool resultado = LlamarDLL(buffer);
  19.             ListBox1->Items->SetText(buffer);
  20.           }
  21.           FreeLibrary(dll);
  22.         }
  23. }
  24.  
  25.  

2
C++ Builder / Re: Error "einvalidpointer"
« en: Miércoles 30 de Enero de 2008, 13:01 »
Gracias, Eternal. Es buena idea mover "mi hilo" al foro de DELPHI

3
C++ Builder / Re: Error "einvalidpointer"
« en: Miércoles 30 de Enero de 2008, 12:10 »
Gracias Amilius por la respuesta; efectivamente, Amilius, la "@" sobra cuando se realiza la llamada. Pero no en los casos anteriores:
@LlamarDLL = GetProcAddress(DLL, "Nombre_Funcion"), pero no LlamarDLL = GetProcAddress(DLL, "Nombre_Funcion")

Eternal Idol, gracias por la respuesta. Esperaré unos días y lo consultaré en el foro DELPHI. El que  haya incluido mi consulta en esta sección se debe a que ese tipo de función ya la tenía en una librería desarrollada con DELPHI (¡y funcionaba!). Parte de esa DLL la estoy ahora reescribiéndola en C++ Builder y me ha aparecido ese error.

4
C++ Builder / Error "einvalidpointer"
« en: Martes 29 de Enero de 2008, 21:36 »
Espero haber acertado con la sección, pues mi consulta tiene que ver tanto con DELPHI como con C++ BUILDER.
Se trata de una llamada a una función de una DLL; muestra una ventana con un objeto TListBox; si se pulsa el botón ACEPTAR la función devuelve TRUE y los valores contenidos en el objeto TListBox. Sin embargo la aplicación (en DELPHI) me devuelve la excepción EInvalidPointer.
CÓDIGO DE LA DLL (C++)
Código: Text
  1.  
  2. extern "C" _declspec(dllexport) bool _stdcall SeleccionarValores(char *buffer);
  3. bool _stdcall SeleccionarValores(char *buffer){
  4.         bool resultado = FALSE;
  5.         Application->CreateForm(__classid(TFVentana), &FVentana);
  6.         try{
  7.            FVentana->ListBox1->Items->Add("PRIMAVERA");
  8.            FVentana->ListBox1->Items->Add("VERANO");
  9.            FVentana->ListBox1->Items->Add("OTOÑO);
  10.            FVentana->ListBox1->Items->Add("INVIERNO");
  11.            resultado = (FVentana->ShowModal == mrOk);
  12.            if (resultado){
  13.            int x;
  14.            x = SendMessage(FVentana->ListBox1->Handle, WM_GETTEXTLENGTH, 0, 0);
  15.            x++;
  16.            buffer = StrAlloc(x);
  17.            buffer = FVentana->ListBox1->Items->GetText();
  18.            }
  19.          }
  20.          __finally{
  21.          delete FVentana;
  22.        }
  23.         return  resultado;
  24. }
  25.  
  26.  
CÓDIGO DEL EXE (DELPHI)
Código: Text
  1.  
  2. procedure TForm1.Button2Click(Sender: TObject);
  3.   type
  4.     TLlamarDLL = function(buffer : PChar):boolean;stdcall;
  5.   var
  6.     LlamarDLL : TLlamarDLL;
  7.     DLL : THandle;
  8.     buffer : pchar;
  9.  begin
  10.    DLL := LoadLibrary('LIBRERIA.DLL');
  11.    if DLL > 0 then
  12.     begin
  13.      @LlamarDLL := GetProcAddress(DLL, 'SeleccionarValores');
  14.     if not(@LlamarDLL = nil) then    
  15.     begin        
  16.         LlamarDLL(buffer);        
  17. // Los valores que se mostraban en el LISTBOX de la DLL los "guardo" en el TCOMBOBOX de la aplicación
  18.         ComboBox1.Items.SetText(buffer);
  19.         StrDispose(buffer);
  20.     end;
  21.    FreeLibrary(DLL);
  22.    end;
  23. end;
  24.  
  25.  
¿Alguien me puede señalar dónde está el error?
Un saludo para todos.

Páginas: [1]