DLL,haciendo TYPE y ENUM

Quiero hacer un DLL pero no se si se puede usar ENUM y TYPE en el DLL, esto porque traté de hacer uno y me daba algunos problemas, con el TYPE no tuve gran problema pero si con los ENUM, consulto, como es la foram correcta de hacerlo, por ejemplo tengo un ENUM ConESinE, así de fácil por escribir algo, como lo ven el parámetro es opcional y por lo tanto le asigno el valor por defecto pregunto lo estoy haciendo bien, ¿o qué más tengo que hacer?, bueno ademas estoy creando la clase para poderla accesar, esto es lo que esta escrito en la clase:
Option Explicit
Public Enum ConESinE
  Con_E
  Sin_E
End Enum
Public Function Get_Posicion_Presu(pProgSub As String, obj As String, IP As String, Optional op As ConESinE = Sin_E) As String
   Get_Posicion_Presu = modulo.Get_Posicion_Presu( pProgSub, obj, IP, op )
End
en el modulo tengo esto escrito
Option Explicit
Public Function Get_Posicion_Presu(pProgSub As String, obj As String, IP As String, Optional op As ConESinE = Sin_E) As String
Dim temp As String
  obj = VBA.Format(obj, "00000")
  If VBA.Trim(IP) = 0 Or VBA.Trim(IP) = "" Or VBA.Trim(IP) = "000" Then
    temp = obj
  Else
    pProgSub = VBA.Trim(pProgSub)
    temp = obj & VBA.Format(IP, "000") & pProgSub
  End If
  Select Case op
    Case Con_E: temp = "E" & temp
    Case Sin_E: temp = temp
  End Select
Get_Posicion_Presu = temp
End Function
Esto es por poner un ejemplo.

1 respuesta

Respuesta
1
Exactamente cual es el inconveniente, que mensaje de error et arroja la aplicación cuando intentas ejecutar el código, ¿cuándo lo compilas?
El rror que me da es Run-time 32979
application-defined of object-defined error, si queires te puedo pasar el proyecto para que tengas una mejor idea
Por el error es que hay un objeto que lo estas definiendo que no esta bien.
Me falto explicar un poco más, resulta ser que creo el DLL, de hecho visual basic me genera el Dll, yo establezco la referencia con ese dll, ahora bien
el el proceso, por ejemplo:
Public sub ProcesoA()
dim x as new MyProyecto.MyFunctions, temp as string
  temp = x.Get_Posicion_Presu("13602", "101","",Con_E)
End Sub
En ese momento me da el error, no se porque será que me da el error si me dejó generrar el dll, yo supuse que todo estaba bien.
Bueno dentro del DLL le agregué unos tipos definidos por el usuario, no se si eso tiene algo que ver o no.
el dll es MyProyecto?  el error te aparece en temp = x.Get_pos....................?
en el dim x as new .............??
Ya analizando más la situación al parecer tengo problemas con la instanciacion, porque lo hice así:
Option explicit
public x as MyProyecto.MyFunctions
Public Sub ProcesoA()
dim temp as string
x = new MyProyecto.MyFunctions
temp = x.Get_Posicion_Presu("13602","101","",Con_E)
End Sub
Al hacerlo así noté que el problema que me esta pasando es a la hora de intanciarlo con el new, de hecho la clase MyFunctions no le coloque ningún proceso en INITIALIZATE, ni en TERMENATE
como te dije el error me esta presentando en por = new ... es decir donde lo instancio
¿Tienes esa referencia agregada a proyecto que instancia la dll?
Si claro, esablecí la referencia al proyecto.
Lo que hice ahora es ver donde tengo la pega (problema), fui probando uno a uno cada función, ya pude detectar donde tengo el problema, y es en el procedimiento donde tengo la Estructura, es decir tengo una función que como parámetros maneja el TYPE, siendo más específico, tengo el siguiente procedimiento:
'En la Clase
'-------------------------------------------------------------------------------------
'--- T I P O S D E F I N I D O S ---------------------------------------------------
'-------------------------------------------------------------------------------------
'para el disponible presupuestario
Public Type MMontos
PptoInic As Double
PptoActu As Double
Liberaci As Double
DisProvi As Double
DisProBK As Double
DisPpto As Double
DisCuota As Double
MontoReb As Double
MSolicit As Double
MComprom As Double
MRecMerc As Double
MDevegad As Double
MPagado As Double
End Type
'ANALIZAR SI SE QUEDA
Public Enum Falta_PP
Presupuesto
Liberacion
FNinguno
End Enum
'ANALIZAR SI SE QUEDA
Public Type TRegistro
brepetido As Boolean
BError As Boolean
dat_Negat As Boolean 'para ver si hay algo raro
dmonto As Double
pmontoAnt As Double
Proble As Falta_PP
End Type
'------------------------------------------------------------------------------
'--- E S P E C I A L E S P A R A P R E S U P U E S T O N A C I O N A L ---
'------------------------------------------------------------------------------
'para obtener el disponible presupuestario para ver si pasa la rebaja
Public Function MSG_Contenido_Presup(ByRef pMontos As MMontos, _
ByRef pOUT_pc As TRegistro, Optional ByRef pError As Boolean = False) As String
MSG_Contenido_Presup = MDGPN.Contenido_Presupuestario(pError, pMontos, pOUT_pc)
End Function
-------------------------------------------------------------------------------
EN EL MODULO ------------------------------------------------------------------
-------------------------------------------------------------------------------
'------------------------------------------------------------------------------
'--- E S P E C I A L E S P A R A P R E S U P U E S T O N A C I O N A L ---
'------------------------------------------------------------------------------
'para obtener el disponible presupuestario para ver si pasa la rebaja
Public Function Contenido_Presupuestario(ByRef pError As Boolean, _
ByRef pMontos As MMontos, _
ByRef pc As TRegistro, _
Optional pMsg_Negativos As String = "") As String
Dim msg As String, dprov As Double, dif As Double, problem As Boolean, mbk As Double
Dim dd(1) As Double, crite As String, dif2 As Double, temp As String
problem = False
pc.Proble = FNinguno
msg = ""
' si el disponible presupuestario es mayor que cero (positivo
If pMontos.DisProvi >= 0 Then
If pc.brepetido = True Then
msg = "Reg.Repetido "
dprov = VBA.CDbl(VBA.FormatNumber((pMontos.DisProvi - (pMontos.MontoReb + pc.pmontoAnt)), 2))
Else
dprov = VBA.CDbl(VBA.FormatNumber((pMontos.DisProvi - pMontos.MontoReb), 2))
End If
'analisis del presupuesto
Select Case (dprov)
Case Is >= 0
msg = "Presupuesto: Rebaja sin problemas"
Case Is < 0
pc.Proble = Presupuesto
If pc.brepetido = True Then
dprov = VBA.CDbl(VBA.FormatNumber(((pMontos.DisProvi - pc.pmontoAnt) - pMontos.MontoReb), 2))
End If
temp = VBA.FormatNumber(VBA.Abs(dprov), 2, -1, -1, -1)
msg = Append_msg(msg, "Presupuesto: " & "No hay Disponible, falta presupuesto por: " & temp)
problem = True
End Select
'hacer analisis en caso de que la liberacion no este buen
If dprov >= 0 Then
If pMontos.DisPpto <> pMontos.DisProvi Then
dd(0) = pMontos.DisPpto - pMontos.DisProvi
dd(1) = pMontos.DisPpto - pMontos.DisProBK
'si d(0) es menor pero diferente que el disponible pre
'si d(1) es mayor es porque solo incluye el blokeo
If dd(0) = dd(1) Then
crite = "BK"
dif = 0
Else
If dd(0) < dd(1) Then
crite = "Co"
'montoq ue esta congelado
dif = dd(1) - dd(0)
Else
crite = "Co"
dif = dd(0) - dd(1)
End If
End If
End If
'analisis de la cuota de liberacion
dif2 = VBA.CDbl(VBA.FormatNumber((pMontos.PptoActu - (pMontos.MontoReb + dif)), 2))
If dif2 < pMontos.Liberaci Then
dif = pMontos.Liberaci - dif2
If dif <> 0 Then
pc.Proble = Liberacion
pc.dmonto = dif
temp = VBA.FormatNumber(VBA.Abs(pc.dmonto), 2, vbTrue, vbTrue, vbTrue)
msg = Append_msg(msg, "Liberacion: " & "Hay que desliberar: " & temp)
problem = True
End If
End If
Else
End If
Else
problem = True
'porque no hay disponible presupuesatario
msg = "Disponible Negativo, no se puede rebajar"
End If
Dim xx As Boolean
xx = False
Dato_Negativo "SO", pMontos.MSolicit, pMsg_Negativos, xx
Dato_Negativo "CO", pMontos.MComprom, pMsg_Negativos, xx
Dato_Negativo "RM", pMontos.MRecMerc, pMsg_Negativos, xx
Dato_Negativo "DE", pMontos.MDevegad, pMsg_Negativos, xx
Dato_Negativo "PA", pMontos.MPagado, pMsg_Negativos, xx
Dato_Negativo "DI", pMontos.DisPpto, pMsg_Negativos, xx
Dato_Negativo "DC", pMontos.DisCuota, pMsg_Negativos, xx
If pMontos.MDevegad < pMontos.MPagado Then
pMsg_Negativos = Append_msg(pMsg_Negativos, "el devengado es menor que el pagado")
If xx = False Then xx = True
End If
pc.dat_Negat = xx
pc.BError = problem
pError = problem
Contenido_Presupuestario = msg
End Function
Private Sub Dato_Negativo(pTipo As String, pMonto As Double, ByRef pMensaje As String, _
ByRef pOUTDato_Negativo As Boolean)
Dim temp As String
If pMonto < 0 Then
If pOUTDato_Negativo = False Then pOUTDato_Negativo = True
Select Case VBA.UCase(pTipo)
Case "SO"
temp = "el solicitado esta negativo"
Case "CO"
temp = "el comprometido esta negativo"
Case "RM"
temp = "la Recepcion de marcancias esta negativo"
Case "DE"
temp = "el devengado esta negativo"
Case "PA"
temp = "el pagado esta negativo"
Case "DI"
temp = "el disponible esta negativo"
Case "DC"
temp = "disponible cuota negativo"
End Select
If VBA.Len(pMensaje) > 0 Then
pMensaje = Append_msg(pMensaje, temp)
End If
End If
End Sub
De hecho si le quito este procedimiento me trabaja pura vida, no entiendo porque, porque anteriormente había hecho una prueba con una función pequeña, pasando una estructura y la hizo perfectamente, por eso pensaba que el que me estaba dando error era el ANUM pero al parecer es que tengo problemas es el TYPE, porque le quito el procedimiento anterior, genero el dll y lo puedo accesar, ahora si quede más confundido que antes pero le vamos llegando.
pues cambia el Type por una clase que defina los campos del type

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas