Problema muy extraño con ShellEjecute

Iniciado por RiasChan, 20 Marzo 2020, 02:28 AM

0 Miembros y 2 Visitantes están viendo este tema.

RiasChan

Jamas di con un problema tan extraño, trataré de resumir. El problema es con un bat

Estoy haciendo un programa que simplemente con un commonddialog selecciono un archivo, el path y la extension queda en un txt, y con un boton se ejecuta lo que haya quedado en el path, o sea seleccono un archivo y lo ejecuto... solo eso.

Que sucede, cuando lo selecciono por primera vez y le doy ejecuitar a ese boton lo abre correctamente.

Luego el sistema mio tiene la opcion de guardar registros de todo eso, asi que mediante los record set guardo en la base de datos cada registro, luego cuando el usuario quiere restarua eso (a modo de preset)

Resulta que carga todo correctamente, cuando lo devulevo el path del programa al mismo txt original, en el textbox se puede apreciar que se lee exactamente IDENTICO a como fuera si el usuario lo hubiera seleccionado recien en lugar de restaurar la preset.

Ahora que pasa... cuando le doy ejecutar, no se ejecuta...

pero si selecciono de nuevo el archivo y una vez vuelto a seleccionar  (obviamente la ruta no cambia ni se modifica a la vista, es exactamente la misma) si anda el ejecutador de mi programa... con solo volver a seleccionar lo mismo

El tema es que lo que selecciono es un bat, entonces en realidad el shell si lo ejecuta, pero se cierra rapidamente, como si fallara algo interno del bat, pero lo tan extraño que destaco, es que simplemente volviendo a cargar manualmente (con mi boton examinar) el archiv bat, si anda. Y la ruta no se modifica.

Es mas, en la linea anterior a ejecutar el shellejecute, puse un msgbox para que muestre al path del programa, y en ambos casos (cuando restauro el preset desde la base de datos, o seleccionado ahi mismo sin usar el recorset) el path es exactamente el mismo y no hay una / de menos o de mas o : o esas cosas..

que podrá ser?

fary

Todo apunta a magia negra.  :rolleyes:  estás seguro que es el mismo path? :xD
Un byte a la izquierda.

**Aincrad**

te dire algo, si no muestras el codigo , nunca te podriamos ayudar a ver donde esta el error.




EdePC

Cita de: **Aincrad** en 20 Marzo 2020, 13:04 PM
te dire algo, si no muestras el codigo , nunca te podriamos ayudar a ver donde esta el error.

- Cierto, al menos una muestra funcional que de el problema + la versión de tu sistema operativo.

RiasChan

#4
Seven x64 estoy ahora. Pero lo programe en PC virtual de XP x 32.

miren el video.

[youtube=640,360]https://www.youtube.com/watch?v=yuzCEsWALaE[/youtube]

donde dice el nombre del acceso directo en el txtbox (el la mitad arriba) ahi va el .exe original, por que eso lo usa para cerrarlo. El programa abre y cierra cada X minutos, Todo funcioa de 10, los registros los relojes, todo, absolutamente todo de 10. SOlo ese maldito coso que ven sin explicacion. El codigo es largo para pasarlo todo, q parte necesitarian ver exactamnte?

NOTA: Por las dudas le meti un msgbox cuando lo programaba con la cantidad de caracteres del txtpath y me daba la misma cantidad de caracters

**Aincrad**

Cita de: RiasChan en 21 Marzo 2020, 06:17 AM
El codigo es largo para pasarlo todo, q parte necesitarian ver exactamnte?

Como te dije antes, Tu como Programador debes revisar el codigo Parte por parte en busca del bug.
Claro esta q si cargas el Present (k.aaa) y no funciona , debes verificar exactamente los valores que carga dicho archivo. y que hace. puede q el error este alli...

Tu pusiste "Brujeria china" cuando no te cargo por medio del (k.aaa) , y despues que cargaste de nuevo el "gg.lnk" pusiste "No cambio nada" quiero hacer enfacis ahi, ya que no puedes afirmar que eso, hay variables en el codigo que no sabes si cambiaron.

(lo que trato decir , es que el error que tienes puede estar en cuando cargas el archivo (k.aaa), que no carga lo que deberia ser. )





No muestras codigo, asi que tendre que "Teorizar / Suponer" donde esta la falla.

Bien, por lo que veo el Programa lo q hace :

1) Abre el gg.lnk (un acceso directo a "Start Todo.bat")

2) se seleccionara en un combobox el Programa de minero.

3) basicamente el programa controla el tiempo del minado y/o guarda el estado donde quedo en un Present (k.aaa) .

---------------------------------------------------------------------------------------------------------------

No has puesto el codigo del Start TODO.bat no podemos saber si es un error en el Script.


No sabemos que Informacion se guarda/carga el archivo de Precencia (k.aaa)

Incluso Podria ser el PhoenixMiner.exe que no se cierra a la Primera vez, tendrias q revisar. y si ese fuera el caso debes Matar el Proceso cuando terminas el minado.




RiasChan

#6
noo, es muchísimo mas simple que es, el guardar preset, lo unico que hace es guradar en una base de datos, mediante adodb.recordset, el contenido de 5 text box, el q tiene el path, los 2 para poner minutos, y alguinas opciones mas.

Entonces cuando el usuario carga eso que guardó antes, simplemente va a la base de datos, toma los datos tal cual se guardarony  los vuelve a poner en los casilleros originales. SOlo eos eso.

Entonces la bruejeria china es,

si cuando el usuario cargó el .bat del acceso directo, en el txtpath se puede ver la ruta (el txt q termina en Start Todo.bat) Entonces el bton verde no hace mas que un shellexecute de ese bat, h ejecuta el scrip del bat y anda (ahora, cuando lo hace por primra vez) si carga el preset (o sea, el recorset pone en el txtpath exactamente el mismo sin espacios ni nada de mas ni menos), ejecuto el shellexecute y no anda. Pero la direccion que se le pasó al ShellExecute.. es exactamente la misma que si lo hubiera cargado con el bton de examinar, o la hubiera escrito manual o lo que sea... el problema está o en el bat, o en el shellexecute, mas bien diria en algo raro entre ambas cosas, por que el shellExecute ejecuta perfecamente lo que sea sacando los bat, cualquier cosa sea cargada con preset o en el mismo boton examinar, anda siempre. Es solo con los bats. Realmente creo que es alguna configuracion externa tal vez :/

Tal vez sea alguna limpieza de variables, o algun parámetro del ShellExecute, por que lo de "Usar Presets" no es mas que guardar y restaurar los mismos datos que el usuario puso en una base de acces, y restaurar eso tal cual a donde estaba.

REsumen nivel 5:

1)Boton examinar da => c:/hola.bat  El usuario usa el ShelExecute (el boton verde) >> Anda bien
2)Boton guardar preset. c:/hola.bat se guarda en la base de datos
3)Boton restaurar: Restaura en txtpath c:/hola.bat exacctamente igual que en el 1 queda en el txtpath
4) El boton verde ejecuta el shellexecute > no anda.
5) Hago el paso 1 y anda.

ShellExecute actua sobre el path del txtpath, no una variable. Y ademas lo mas extraño, es que de entrada anda, luego no.  Creo que desistiré, no parec problema del programa, debe ser algo del entorno de windows o de los bat en si, o algo en el parámetro del ShellExecute, uso el ShellExecute mas comun y corriente:

Private Declare Function ShellExecute Lib "shell32.dll" Alias _
    "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
    ByVal lpFile As String, ByVal lpParameters As String, _
    ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Sub btnEjecutar_Click()
    ' Ejecutar un acceso directo
dim ret
ret = ShellExecute(Me.hWnd, "Open", txtpath.text, "", "", 1)

End Sub

RayR

No sé si aún te sirva, pero es bastante obvio que algo sí que es diferente en ambos casos, y es un error muy común cuando uno tiene poca experiencia. Siempre que uses cuadros de diálogo para abrir o guardar archivos, ten presente que te pueden cambiar el directorio actual (working directory).

Puedes ver que eso está ocurriendo en tu programa. Fíjate en tu video, en las ventanas de consola, desde dónde se están ejecutando los comandos del bat. Seguro alguno de esos comandos depende de la ruta, y por eso el error.

RiasChan

#8
Cita de: RayR en 25 Marzo 2020, 17:02 PM
No sé si aún te sirva, pero es bastante obvio que algo sí que es diferente en ambos casos, y es un error muy común cuando uno tiene poca experiencia. Siempre que uses cuadros de diálogo para abrir o guardar archivos, ten presente que te pueden cambiar el directorio actual (working directory).

Puedes ver que eso está ocurriendo en tu programa. Fíjate en tu video, en las ventanas de consola, desde dónde se están ejecutando los comandos del bat. Seguro alguno de esos comandos depende de la ruta, y por eso el error.

Hola. No creo, sigo pensando que es brujeria china. Desde el dia que dejé esto es por que me llené de odio luego de reever el codigo de las formas que sean, y no le encontré la vuelta. Hoy luego de?? 1 mes? decidí retomarlo, para intentar nuevamente y sigo sin encontrar respuesta. Me enfermé a tal punto que iba a directamente a rehacer el proyecto, pero me calmé y pensé un poco:

Situacion: No hay forma, sólo anda de esa forma. ¿Que hago? busco la solucion? ya no, la busque demasiadoy  no la encontré. Entonces buscaré la solución más elegante.

Lo solucioné, creando un acceso directo.

Seré extenso pero repetiré el problema.


Tu primera cita

Cita de: RayR en 25 Marzo 2020, 17:02 PM
No sé si aún te sirva, pero es bastante obvio que algo sí que es diferente en ambos casos, y es un error muy común cuando uno tiene poca experiencia. Siempre que uses cuadros de diálogo para abrir o guardar archivos, ten presente que te pueden cambiar el directorio actual (working directory).

Puedes ver que eso está ocurriendo en tu programa. Fíjate en tu video, en las ventanas de consola, desde dónde se están ejecutando los comandos del bat. Seguro alguno de esos comandos depende de la ruta, y por eso el error.


tendría argumento lógico y real si fallara luego de cargar una preset con cualquier tipo de archivo. O sea si yo guardo una preset, salgo de programa, lo inicio de nuevo, cargo una preset, le doy Play y falla con todos los archivos, claramente es lo que dices: un error en el directorio actual.

Pero no es el caso, ya que cualquier archivo que exista (excepto los bat) Funciona bien. Inicio el programa > Cargo la preset, le doy play al programa, y el programa o archivo se ejcuta sin problema y sigue la función de mi original de mi programa.


Pero no, sólo falla con los BAT (y no sé si todos, al menos los que uso).

Resumen del problema:

Si inicio el programa, seleccciono el bat, le doy play.. anda
Si inicio el programa, selecciono cualquier programa u archivo, le doy play... anda
Si Inicio el programa, guardo una preset del bat, Lo cierro, cargo la preset y le doy play, NO ANDA. Es decir, abre el CMD rápido y se cierra.
Si inicio el programa, guardo una preset con cualquier archivo, y le doy play, Anda...

Lo que hace mi programa cuando selecciona el archivo, es simplemente abrir el commonDialog, el FileName (ruta completa con archivo y extensión incluidos) queda guardado en la caja de text "txtpath" luego el boton preset guarda eso en una base de datos. Cuando se carga la preset desde otro boton, se trae la info desde la base de datos al casillero de origen. Fin, eso es el 50% del programa.

Al levantar es  recordset. el botón de "iniciar" manda el ShellExecute al TXTpath, y obviamente anda, con todo y todas las preset, menos el jodido bat... (sólo si es cargado desde un preset preset, pero cualquier otro archivo si anda cargando preset :/).


Brujería del Tío Bill.. para mi algun error interno desconcido entre el CMD y las API de ShellExecute, Shell, o el WinExec. Con ninguna de las 3 andubo,
tal vez al final del recordset en el levante de los datos a la base de datos al sistema tenga algo... O tal vez en el option explicit para abajo.. En fin, para mi absolutamente todo queda descartado por que anda con todo lo que existe en entorno windows, con o sin carga de presets, menos con los bat luego de ser levantados desde la base de datos.

En fin, cual es la solución? La única y comentada al principio del post, volver a seleccionar el archivo Bat, o el acceso directo a dicho bat, desde el boton que abre el common dialog. Solamente hacer eso, y darle play, ya anda, sino se cierra al toque la ventana del CMD


Cual es la solcucion elegante? Simplemente cuando guardo la preset, en secreto sin decirle al usuario le borro la carpeta system32 y todas sus fotos guardo en el path del programa un acceso directo a esa ***** que haya seleccionado al principio.

Cuando inicia el programa, pregunta si es un bat, si pone que no, ejecuta normalmente algo que no sea bat y obviamente anda. Si pone que si, abre de nuevo el commonDialog en la carpeta interna del programa, y hace doble click en el acceso directo, ya con eso sigue la funcion correcta de todo el sistema y anda perfectamente. Digamos unos 4 clicks de más.

No se me ocurrió otra cosa, probé demasiadas cosas y jamás quiso andar.


Cita de: **Aincrad** en 21 Marzo 2020, 14:04 PM


No has puesto el codigo del Start TODO.bat no podemos saber si es un error en el Script.


No sabemos que Informacion se guarda/carga el archivo de Precencia (k.aaa)

Incluso Podria ser el PhoenixMiner.exe que no se cierra a la Primera vez, tendrias q revisar. y si ese fuera el caso debes Matar el Proceso cuando terminas el minado.


Ni lei eso que me pedias el codigo del bat... a ver si era eso.

Por cierto si, es la función principal del programa y por eso se pide aparte (escrito manualmente x el user) el nombre del .exe. Cierra el .exe en un momento.

El bat tiene esto


setx GPU_FORCE_64BIT_PTR 0
setx GPU_MAX_HEAP_SIZE 100
setx GPU_USE_SYNC_OBJECTS 1
setx GPU_MAX_ALLOC_PERCENT 100
setx GPU_SINGLE_ALLOC_PERCENT 100
EthDcrMiner64.exe -epool us2.ethermine.org:4444 -ewal 0x8cce0e45e0fe85f3f70380825c23975b2235.MineraHanlRX570 -epsw x -mport 0 -showdiff 1 -showpower 1 -dbg -1 -rxboost 0



RiasChan

#9
Fail sorry. Arriba ultima