PDA

Ver la Versión Completa : linker error en c++ builder 6


mns
27-04-2008, 16:51:32
estoy haciendo una aplicacion cliente servidor con paradox ,
en el programa servidor me pasa que convierto varias variables AsiString
a entero , el problema es que al hacer esto y construir la aplicacion me da un error de linker error unresolved external 'StrToIntA' referenced from (ruta)/principal.obj

El problema es casi seguro que es por el RemoteModule , ya que he hecho otra aplicacion solo para probar , funciona con la base de datos y todo bien , ahora bien , intento convertir una string a entero y el error nuevamente(si es una aplicacion sin el remoteModule no lo hace .


// DATOSTABLASSIMPLESIMPL.H : Declaration of the datosTablasSimples

#ifndef datosTablasSimplesImplH
#define datosTablasSimplesImplH

#define ATL_FREE_THREADED
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <MidConst.hpp>

#include "PcNowServer_TLB.H"
#include <DB.hpp>
#include <DBTables.hpp>
#include <Provider.hpp>
#include <xmldom.hpp>
#include <Xmlxform.hpp>
#include <atl/atlvcl.h>



// Forward ref. of IAppServer implementor


/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
class TdatosTablasSimples : public TCRemoteDataModule
{
__published: // IDE-managed Components
TDataSetProvider *providerClientes;
TTable *tablaClientes;
TTable *tablaArticulos;
TTable *tablaProveedoresDuplicados;
TTable *tablaStock;
TTable *tablaProveedores;
TTable *tablaPresupuestos;
TTable *tablaFacturasProveedores;
TTable *tablaAbonosProveedores;
TTable *tablaClientesDuplicados;
TDataSetProvider *dataClientesDuplicados;
TDataSetProvider *dataArticulos;
TDataSetProvider *dataProveedores;
TDataSetProvider *dataProveedoresDuplicados;
TDataSetProvider *dataAbonosProveedores;
TDataSetProvider *dataFacturasProveedores;
TDataSetProvider *dataPresupuestos;
TDataSetProvider *dataStock;
TQuery *consultaBusqueda;
TDataSetProvider *dataConsultaBusqueda;
TDataSetProvider *dataTipoArticulo;
TTable *tablaTipoArticulo;
TTable *tablaFabricante;
TTable *tablaModelo;
TDataSetProvider *dataFabricante;
TDataSetProvider *dataModelo;
TDataSetProvider *dataVersionSoft;
TTable *tablaVersionSoft;
TTable *tablaFabricanteSoftware;
TDataSetProvider *dataFabricanteSoftware;
TDataSetProvider *dataFacturasClientes;
TTable *tablaFacturasClientes;
TDataSetProvider *dataAlbaranesClientes;
TDataSetProvider *dataAbonosClientes;
TTable *tablaAlbaranesClientes;
TTable *tablaAbonosClientes;
private: // User declarations
public: // User declarations
__fastcall TdatosTablasSimples(TComponent* Owner);

__published:
};


/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
extern PACKAGE TdatosTablasSimples *datosTablasSimples;


/////////////////////////////////////////////////////////////////////////////
// TdatosTablasSimplesImpl Implements IdatosTablasSimples, default interface of datosTablasSimples
// ThreadingModel : Apartment
// Dual Interface : TRUE
// Event Support : FALSE
// Default ProgID : PcNowServer.datosTablasSimples
// Description :
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE TdatosTablasSimplesImpl: REMOTEDATAMODULE_IMPL(TdatosTablasSimplesImpl, datosTablasSimples, TdatosTablasSimples, IdatosTablasSimples)
{
public:

BEGIN_COM_MAP(TdatosTablasSimplesImpl)
RDMOBJECT_COM_INTERFACE_ENTRIES(IdatosTablasSimples)
END_COM_MAP()

// Data used when registering Object
//
DECLARE_THREADING_MODEL(otApartment);
DECLARE_PROGID(_T("PcNowServer.datosTablasSimples"));
DECLARE_DESCRIPTION(_T(""));

// Function invoked to (un)register object
//
static HRESULT WINAPI UpdateRegistry(BOOL bRegister)
{
TRemoteDataModuleRegistrar regObj(GetObjectCLSID(), GetProgID(), GetDescription());
// Disable these flags in order to disable use by socket or web connections.
// Also set other flags to configure the behavior of your application server.
// For more information, see atlmod.h and atlvcl.cpp.
regObj.Singleton = false;
regObj.EnableWeb = true;
regObj.EnableSocket = true;
return regObj.UpdateRegistry(bRegister);
}


// IdatosTablasSimples
protected:
};

#endif // datosTablasSimplesImplH

escafandra
27-04-2008, 23:29:44
Este error tuyo, y tras comprobar que sólo aparece con el RemoteModule, me suena a conflicto entre funciones con el mismo nombre sin definir un namespace.

StrToIntA está definida en la libreria shlwapi.h.
Se define como:
LWSTDAPI_(int) StrToIntA(LPCSTR lpSrc); // Recibe un puntero char (char*)En esa misma librería definen StrToInt como:
#define StrToInt StrToIntA

Por otro lado, las VCL definen StrToInt en sysutils.hpp como
extern PACKAGE int __fastcall StrToInt(const AnsiString S); // recibe un AnsiString.Lo que me extraña es que no tengas un error del compilador previo al link. Doble definición...

No se como son los AnsiString que tratas de convertir a enteros, ¿son ansiString o son char*?. Trata de llamar asi a la función, forzando el cast:

int n = StrToInt(AnsiString(Cadena));Otra posible solución es convertir tu AnsiString a char* y usar int atoi(const char*) al estilo del C clásico:

int n = atoi(Cadena.c_str());Finalmente decirte que investigues la necesidad de usar namespaces para utilizar el módulo que te genera el conflicto. Mas no te puedo decir pues nunca he trabajado con él.

Espero haberte servido de alguna ayuda.

Saludos.

mns
28-04-2008, 08:00:02
muchas gracias por todo
al final he usado atoi() para solucionarlo y todo bien menos mal
cuando tenga un poco mas de tiempo me pondre a buscar a ver si encuentro
el origen del fallo , pero por ahora funciona bien asi .
mil veces agradecido