none
Diferencias al compilar en Windows 2008 Server y Windows XP RRS feed

  • Pregunta

  • Buenas tardes.

    Soy nuevo en este foro y espero poder servir de ayuda, ya que si bien no soy experto, si tengo ya algo de experiencia en desarrollo y se que he enfrentado situaciones que para muchos son nuevas. Hoy por primera vez en mi vida he decidido participar en un foro de este tipo, ya que lo encuentro muy util.

    Tengo una duda que tiene como origen un problema que ya tengo resulto, sin embargo me gustaria saber si alguien a encontrado la solucion.

    No acostumbro escribir en vb6, pero me ha surgido la necesidad y tube que hacerlo, la cuestion es la siguiente, tengo la siguiente funcion en un modulo:

    Sub crear_archivo()

    Dim archivo As String

    ruta_archivo_datos = App.Path & "\rtAdminCore\" & usuario_actual & "temp.mtrx" archivo = Dir$(ruta_archivo_datos) remision_datos = "[1]" & procedimiento_interno & vbCrLf & _ "[2]" & IDs & vbCrLf & _ "[3]" & ADODB_conexion & vbCrLf & _ "[4]" & User_ID & vbCrLf & _ "[5]" & Group_ID & vbCrLf & _ "[6]" & Module_ID If archivo = "" Then Set escritor = CreateObject("Scripting.FileSystemObject") Set documento = escritor.CreateTextFile(ruta_archivo_datos, True) documento.writeline remision_datos Else espera (100) Set escritor = CreateObject("Scripting.FileSystemObject") Set documento = escritor.CreateTextFile(ruta_archivo_datos, True) MsgBox "Archivo de datos se elimino" documento.writeline remision_datos End If End Sub

    Al compilarlo en entorno Windows Server 2008 R2 y ejecutarlo en Windows 7, 8, 2008, funciona sin problemas, aunque al ejecutarlo en Windows XP y Windows 2003 Server, genera una exepcion con codigo: 91, Descripcion: "object variable or with block variable not set". He resuelto el problema compilando exactamente el mismo proyecto en una maquina virtual con Windows XP, de este modo no tiene ningun problema en ningun entorno que se ejecute (Hasta donde pude probar). Entiendo que la excepcion se genera en el segmento :

        Set escritor = CreateObject("Scripting.FileSystemObject")
        Set documento = escritor.CreateTextFile(ruta_archivo_datos, True)

    Aunque he intentado varias soluciones sin exito, la unica solucion que he encontrado es compilarlo en Windows XP.  Tambien entiendo podria no tener nada que ver el sistema operativo, sin embargo es lo que yo he podido detectar.

    Agradezco mucho su atencion y espero alguien se apiade de mi ignorancia.


    martes, 30 de diciembre de 2014 8:08

Todas las respuestas

  • ¿Está 100% seguro que esa es la línea donde se da el error?  De lo que muestra, la única posibilidad es que la variable escritor sea Nothing, pero si eso fuera cierto, ¿por qué CreateObject() no arrojó error?  Si escritor fuera Nothing, yo hubiera esperado más bien que CreateObject() hubiera devuelto un error 424:  ActiveX can't create object.  Por lo tanto dudo que esas sean las líneas del error.

    ¿Validó usted la composición de la ruta y nombre de archivo?  Verá, la buena práctica de programación dicta que uno no debe concatenar pedazos de rutas sin más ni más.  En .net usamos System.IO.Path.Combine(); en VB clásico creo que no hay similar y en VBScript el FileSystemObject tiene el método BuildPath().  Nunca concatenamos porque no sabemos las pequeñas grandes diferencias entre sistemas operativos.  Windows XP podría agregar el \ en App.Path, pero tal vez Windows 7 no lo hace.

    En VB clásico yo crearía una función que concatene inteligentemente, asegurándose que la unión de las partes del path contienen 1 y exactamente 1 \.


    Jose R. MCP
    Code Samples

    martes, 30 de diciembre de 2014 18:10
  • Gracias por tu respuesta. Me fue muy util tu sugerencia de hacer una funcion en VB6 para tratar las cadenas con formato de ruta y tu mencion sobre la clase FileSystemObject en .NET, en verdad no se me habria ocurrido nunca que podrian darse ese tipo de excepciones que dependan del sistema operativo. Por el momento te puedo decir que hice pruebas con los respectivos productos de la compilacion del proyecto en ambos sistemas como los he venido probando y he verificado lo que me mencionas con respecto a un posible error al concatenar las variables y App.Path, y no he encontrado problema, la ruta existe, los parametros de seguridad del directorio estan "para Todos" (ademas de que ejecuto el programa desde la sesion de administrador).

    Ademas me preguntabas si estoy seguro de que es esa linea especificamente la que tiene el problema. La respuesta es, si. Aunque no lo puse en el codigo de la funcion que publique en mi primer mensaje, el codigo deberia verse asi:

    Sub crear_archivo() On Error GoTo error Dim archivo As String ruta_archivo_datos = App.Path & "\rtAdminCore\" & usuario_actual & "temp.mtrx" archivo = Dir$(ruta_archivo_datos) remision_datos = "[1]" & procedimiento_interno & vbCrLf & _ "[2]" & IDs & vbCrLf & _ "[3]" & ADODB_conexion & vbCrLf & _ "[4]" & User_ID & vbCrLf & _ "[5]" & Group_ID & vbCrLf & _ "[6]" & Module_ID If archivo = "" Then Set escritor = CreateObject("Scripting.FileSystemObject") Set documento = escritor.CreateTextFile(ruta_archivo_datos, True) documento.writeline remision_datos Else espera (100) Set escritor = CreateObject("Scripting.FileSystemObject") Set documento = escritor.CreateTextFile(ruta_archivo_datos, True) MsgBox "Archivo de datos se elimino" documento.writeline remision_datos End If error: MsgBox (Err.Number & " " & Err.Source & " " & Err.Description) End Sub

    Como se puede observar al "cachar" la excepcion, se muestra un dialogo que contiene la propiedad Source del manejador de errores, la cual refleja "FileSystemObject".

    los objetos escritor y documento no son Nothing ya que es la unica funcion en la que los uso estas variables, aunque en ningun punto del proyecto estan delcaradas explicitamente.

    Por el momento ya tengo una idea, segun lo que me dijiste de que se trata e intentare reproducir el error.

    miércoles, 31 de diciembre de 2014 1:27
  • Si realmente es el FileSystemObject, supongo que puede probar rápidamente en VBScript a ver si da el error.

    En un archivo de texto guardado como VBS, puede intentar crear ese archivo.  El código es básicamente el mismo.  VBS no soporta On Error Goto, así que deberá prescindir de él o usar On Error Resume Next.  La espera de 100 ms, que supongo la hace con un llamado a la función nativa Sleep() deberá cambiarla por el Sleep del objeto WScript.

    Corra el VBS en ambas PC's (XP y 7 u 8 o donde sea que le da problema).


    Jose R. MCP
    Code Samples

    miércoles, 31 de diciembre de 2014 12:10