| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Jue 04 May, 2006 7:59 pm Asunto: Error Ambiguity con GdiPlus |
|
|
Hola,
Quiero utilizar el gdiplus. Lo que he hecho de momento es añadir al proyecto (bds 2006 en xp) la libreria: gdiplus.lib que trae el mismo builder.
En el fichero de cabecera del form añado:
| Código: |
#define STRICT
#include <windows.h>
#include <algorithm>
using std::min;
using std::max;
#include <gdiplus.h>
|
Segun: http://www.leunen.com/cbuilder/gdiplus.html
No tengo nada mas de codigo.
Y al compilar me da el siguiente error:
[C++ Error] GdiplusGraphics.h(34): E2015 Ambiguity between 'Gdiplus::Graphics::Graphics(void *)' and 'Gdiplus::Graphics::Graphics(void *,int)'
Este fichero donde da error: GdiplusGraphics.h viene con el mismo builder, asi que no quiero tocarlo.
No se como solucionarlo. Necesito vuestra ayuda. Gracias. |
|
| Volver arriba |
|
 |
dodongoxp Ens


Registrado: 21 Dic 2005Mensajes: 37Ubicación: Leon Guanajuato Mexico
|
Publicado: Jue 04 May, 2006 10:36 pm Asunto: |
|
|
holas
eso sale cuando hay funciones sobrecargadas ( function overload) ..y el compiler no sabe a que funcion llamar.. y requiere que de alguna forma le especifiques de manera explicita cual funcion exactamente es la que quieres llamar
ami me ha salido un par de veces cuando me piden una string y pongo "blabla" y hay 2 funciones sobrecargadas una que pide WideString y otra AnsiString y le tengo que poner (WideString)"blabla" para que sepa cual exactamente o casos por el estilo.. aunque por el momento no estoy 100% seguro.. sera cosa de investigar un poco...
espero que cuando menos te haya dado una idea de lo que intente decir hehehe
Saludos!  _________________ Hermes David Montes de oca Segovia
dodongoxp@yahoo.com |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 04 May, 2006 11:38 pm Asunto: |
|
|
En el BCB2006 no es necesario que pongas todo eso, puedes usar solo el include "gdiplus.h" y STRICT ponlo globalmente, en las propiedades del proyecto en "Conditional defines".
Para localizarlo:
MENU: Project -> Options...
TREEVIEW: C++ Compiler (bcc32) -> Paths and Defines
EDIT: Conditional defines (-D)
A mi haciendolo así me funcionan los ejemplos de esa web. |
|
| Volver arriba |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Vie 05 May, 2006 8:13 am Asunto: |
|
|
Supongo que para utilizar las librerías en BCB6 Enterprise el método a seguir es diferente. Gracias al enlace que ha dejado kalux y a "san google" he seguido los siguientes pasos:
1º- He generado el archivo .lib necesario con
implib -c -f gdiplus.lib gdiplus.dll y luego lo he pegado en el directorio lib de mi BCB.
2º- En el .cpp de mi proyecto:
| Código: |
//---------------------------------------------------------------------------
#define STRICT
#include <windows.h>
#include <algorithm>
using std::min;
using std::max;
#include <gdiplus.h>
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
// Initialize GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
//shutdown GDI+
Gdiplus::GdiplusShutdown(gdiplusToken);
}
//---------------------------------------------------------------------------
|
3º- En la parte privada del archivo .h:
| Código: |
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
|
4º- He añadido al proyecto el archivo gdiplus.lib.
5º- Project ->Options ->Directories/Conditionals y en el apartado Conditional defines: he añadido STRICT.
Pues no hay manera, al ejecutar el proyecto me da los siguientes mensajes:
| Código: |
[C++ Warning] GdiplusHeaders.h(582): W8022 'Bitmap::Clone(const Rect &,int)' hides virtual function 'Image::Clone()'
[Linker Error] Unresolved external 'GdiplusStartup' referenced from C:\ARCHIVOS DE PROGRAMA\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'GdiplusShutdown' referenced from C:\ARCHIVOS DE PROGRAMA\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
|
¿Alguien tiene experiencia con estas librerías y las ha hecho funcionar con BCB6 ? _________________ ¡ADELANTE CON ESTE SUPER FORO! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 05 May, 2006 3:27 pm Asunto: |
|
|
Tugui: Seguramente no estás creando correctamente el .LIB o no lo has añadido correctamente al proyecto. Te has fijado si al hacerlo en la consola te ha devuelto algún mensaje de error ? Si es así te creara un .LIB vacio.
Si tienes instalado WindowsXP en C:\Windows, no te olvides de poner la ruta:
implib -c -f gdiplus.lib c:\windows\system32\gdiplus.dll |
|
| Volver arriba |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Vie 05 May, 2006 3:42 pm Asunto: |
|
|
| Gracias Leo, ahora si. |
|
| Volver arriba |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Vie 05 May, 2006 11:12 pm Asunto: |
|
|
Bueno... al principio si, gracias otra vez a _Leo escribiendo la ruta completa en la línea de comando se ha compilado un par de veces el proyecto pero con un warning, y al tercer intento ya ni eso, ya me ha saltado otro error:
| Código: |
[C++ Warning] GdiplusHeaders.h(582): W8022 'Bitmap::Clone(const Rect &,int)' hides virtual function 'Image::Clone()'
[Linker Error] Error processing module C:\ARCHIVOS DE PROGRAMA\BORLAND\CBUILDER6\LIB\STLPMTI.LIB|STLPMT45.DLL
|
Todas estas pruebas las estoy haciendo con un proyecto totalmente nuevo y compilando el formulario principal totalmente vacío. Ya no se que pensar, probaré en otro ordenador a ver si tengo más suerte. _________________ ¡ADELANTE CON ESTE SUPER FORO! |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 15 May, 2006 1:40 pm Asunto: |
|
|
hola ahora me toca preguntar a mi, jeje
Estoy usando el BDS2006, alguien sabe el por que de esta situacion al compilar una libreria, he realizado una DLL con funciones propias, sigiendo los pasos de _Leo, para hacer las DLL's
pero me sale el siguiente error
| Código: | [Linker Error] Error: Unresolved external 'Jpeg::TJPEGImage::' referenced from D:\H2W\BORLAND STUDIO PROJECTS\DEBUG_BUILD\UNIT1.OBJ |
Este es el archivo de la Dll ccsgDll.h
| Código: |
#ifndef dllH__ccsg
#define dllH__ccsg
//----------------------
#ifdef _ccsgDLL_
#define ccsgPUBLIC __declspec(dllexport)
#else
#define ccsgPUBLIC __declspec(dllimport)
#endif
//----------------------
// ENCABEZADOS DE FUNCIONES
#include <IBCustomDataSet.hpp> // para las bases de datos
#include <jpeg.hpp> // PARA LAS IMAGENES
#include <ScktComp.hpp> // PARA LOS SOCKETS
ccsgPUBLIC TMemoryStream * __fastcall ImagenToStream(AnsiString Nombre_y_Ruta);
ccsgPUBLIC TJPEGImage* __fastcall BlobToJpg(TBlobField *CampoBLOB);
#endif |
bien este es el codigo, del archivo ccsgDll.cpp
| Código: |
//---------------------------------------------------------------------------
#include <vcl.h>
#define _ccsgDLL_
#include "ccsgDll.h"
#include <memory>
#include <stdio.h>
#include <jpeg.hpp>
#pragma hdrstop
#pragma argsused
//USERES("pccsgDll.res");
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
// CARGA UNA IMAGEN Y REGRESA UN STREAM
//---------------------------------------------------------------------------
ccsgPUBLIC TMemoryStream * __fastcall ImagenToStream(AnsiString Nombre_y_Ruta)
{
Jpeg::TJPEGImage *jpg = new Jpeg::TJPEGImage();
TMemoryStream *StreamTmp = new TMemoryStream;
AnsiString Ext = ExtractFileExt(Nombre_y_Ruta);
if(UpperCase(Ext.Trim()) == ".GIF" || //imagen GIF
UpperCase(Ext.Trim()) == ".WMF" || // wmf
UpperCase(Ext.Trim()) == ".EMF" || // emf
UpperCase(Ext.Trim()) == ".ICO" || // ICO
UpperCase(Ext.Trim()) == ".BMP" || //bmp
UpperCase(Ext.Trim()) == ".JPG" || // jpg
UpperCase(Ext.Trim()) == ".JPEG" // jpeg
//UpperCase(Ext.Trim()) == ".PNG" // jeje
)
{
TImage *imagen = new TImage(NULL);
const int HIMETRIC_INCH = 2540;
IPicture *pPicture = NULL;
OleLoadPicturePath( StringToOleStr(Nombre_y_Ruta), NULL, 0, 0, IID_IPicture, (void**)&pPicture);
// Carga la imagen en el TImage temporal
if (pPicture)
{
imagen->Picture = NULL;
long ancho, alto;
pPicture->get_Width(&ancho);
pPicture->get_Height(&alto);
imagen->Picture->Bitmap->Width = MulDiv(ancho,GetDeviceCaps(imagen->Canvas->Handle, LOGPIXELSX), HIMETRIC_INCH);
imagen->Picture->Bitmap->Height = MulDiv(alto,GetDeviceCaps(imagen->Canvas->Handle, LOGPIXELSY), HIMETRIC_INCH);
RECT rect = imagen->ClientRect;
pPicture->Render(imagen->Canvas->Handle, 0, 0,imagen->Picture->Bitmap->Width, imagen->Picture->Bitmap->Height,0, alto, ancho, -alto, &rect);
pPicture->Release();
jpg->Assign(imagen->Picture->Bitmap);
jpg->SaveToStream(StreamTmp);
}
delete imagen;
}
delete jpg;
return(StreamTmp);
}
//---------------------------------------------------------------------------
// funcion que extrae una imagen contenida en un blob y la convierte a jpg
//---------------------------------------------------------------------------
ccsgPUBLIC TJPEGImage* __fastcall BlobToJpg(TBlobField *CampoBLOB)
{
if(!CampoBLOB->Value.IsEmpty())
{
TJPEGImage *cJPeg = new TJPEGImage();
TMemoryStream *StreamTmp = new TMemoryStream;
CampoBLOB->SaveToStream(StreamTmp); //sacamos el jpg y se convierte a stream
StreamTmp->Seek(0,soFromBeginning);
cJPeg->LoadFromStream(StreamTmp);
return(cJPeg);
}
else
return(NULL);
}
//---------------------------------------------------------------------------
|
pero al usar esta DLL dentro de un form, y declarar algo como esto
| Código: | TJPEGImage *c = new TJPEGImage; |
me aparecen los siguientes mensajes
| Cita: | [Linker Error] Error: Unresolved external 'Jpeg::TJPEGImage::' referenced from D:\H2W\BORLAND STUDIO PROJECTS\DEBUG_BUILD\UNIT1.OBJ
[Linker Error] Error: Unresolved external '__fastcall Jpeg::TJPEGImage::TJPEGImage()' referenced from D:\H2W\BORLAND STUDIO PROJECTS\DEBUG_BUILD\UNIT1.OBJ
[Linker Error] Error: Unresolved external '__fastcall AutoHideBarraTareas(int)' referenced from D:\H2W\BORLAND STUDIO PROJECTS\DEBUG_BUILD\UNIT1.OBJ |
alguien le ha salido algo por el estilo _________________
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 15 May, 2006 2:54 pm Asunto: |
|
|
Me autocontesto yo mismo, ,jajajajajjaja
| Código: |
IMPLIB LIB_DESTINO.LIB DLL_ORIGEN.DLL |
_Leo sabes donde puedo deshabilitar o marcar esta opcion en el BDS2006 para que no este realizando esta operacion cadavez que tenga que recompilar la dll _________________
 |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 15 May, 2006 4:01 pm Asunto: |
|
|
| Cita: | | _Leo sabes donde puedo deshabilitar o marcar esta opcion en el BDS2006 para que no este realizando esta operacion cadavez que tenga que recompilar la dll |
Te refieres a que se cree o no automáticamente el .lib al compilar el proyecto de la DLL ?
MENU: Project -> Options...
TREEVIEW: Linker -> Linking
CHECKBOX: Generate import library |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 16 May, 2006 11:18 am Asunto: |
|
|
Efectivamente, lo que trato es de implementar el lib, ya que al no hacerlo con IMPLIB me genera el error y me agradaria que al generar la DLL tambien el archivo LIB, fuera ya con la opcion IMPLIB. _________________
 |
|
| Volver arriba |
|
 |
|