• Miércoles 1 de Mayo de 2024, 03:18

Autor Tema:  Error "einvalidpointer"  (Leído 2502 veces)

MON___

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Error "einvalidpointer"
« en: Martes 29 de Enero de 2008, 21:36 »
0
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.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Error "einvalidpointer"
« Respuesta #1 en: Miércoles 30 de Enero de 2008, 01:36 »
0
¿Estas seguro que esto va asi con los @?  :blink:
Código: Text
  1.  
  2.   var
  3.    LlamarDLL : TLlamarDLL;
  4.  
  5. ....
  6.  
  7.     @LlamarDLL := GetProcAddress(DLL, 'SeleccionarValores');
  8.    if not(@LlamarDLL = nil) then  
  9.  
  10.  

Me parece que LlamarDLL debería ser puntero a TLlamarDLL y remover las arrobas.  :P seguramente se necesitan más cambios pero es lo que veo

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error "einvalidpointer"
« Respuesta #2 en: Miércoles 30 de Enero de 2008, 08:07 »
0
Cita de: "MON___"
Espero haber acertado con la sección, pues mi consulta tiene que ver tanto con DELPHI como con C++ BUILDER.
Si la DLL cuando es llamada desde C++ funciona bien entonces habria que mover el hilo al foro de Delphi.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

MON___

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Error "einvalidpointer"
« Respuesta #3 en: Miércoles 30 de Enero de 2008, 12:10 »
0
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.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error "einvalidpointer"
« Respuesta #4 en: Miércoles 30 de Enero de 2008, 12:39 »
0
Cita de: "MON___"
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.
No me entendiste bien. Si cuando llamas a esa funcion desde un programa de C++ funciona bien entonces voy a mover tu hilo al foro correspondiente ya que eso significaria que el problema esta en el codigo de Delphi. Si el problema esta en el codigo de C++ entonces esta ubicado correctamente aca.

De cualquier manera nunca repitas temas en diferentes subofors por favor.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

MON___

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Error "einvalidpointer"
« Respuesta #5 en: Miércoles 30 de Enero de 2008, 13:01 »
0
Gracias, Eternal. Es buena idea mover "mi hilo" al foro de DELPHI

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error "einvalidpointer"
« Respuesta #6 en: Miércoles 30 de Enero de 2008, 13:25 »
0
Cita de: "MON___"
Gracias, Eternal. Es buena idea mover "mi hilo" al foro de DELPHI
De nada pero no respondiste mi pregunta. ¿Funciona bien cuando llamas a esa funcion desde un programa de C++, si o no?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

MON___

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Error "einvalidpointer"
« Respuesta #7 en: Miércoles 30 de Enero de 2008, 17:17 »
0
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.