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.
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