Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - kworld

#11
Era error 87, de parámetros.
Ya lo resolví, me ayudaron en el foro de la msdn, me dijeron que CreateEnvironmentBlock siempre devuelve un bloque unicode, así es que me faltaba el flag CREATE_UNICODE_ENVIRONMENT

Al final mi code quedó así:


#define UNICODE

#include <windows.h>
#include <stdio.h>
#include <userenv.h>

int main()
{   
    LPVOID env_block;   
    if (!CreateEnvironmentBlock(&env_block, NULL, FALSE))
    {
      printf("No CreateEnvironmentBlock. Error:%d\n",GetLastError());
    }
   

   
    PROCESS_INFORMATION pi;
    memset(&pi, 0, sizeof(pi));
   
    STARTUPINFO si;
    memset(&si, 0, sizeof(si));
si.cb = sizeof(si);

si.dwFlags = STARTF_USESHOWWINDOW;
si.lpTitle = TEXT("");
si.wShowWindow = SW_NORMAL;
   
   
    LPTSTR program = TEXT("cmd.exe");
    LPTSTR params = TEXT("/c \"C:\\Users\\Carlos\\Desktop\\hola.cmd\"");
    BOOL b;
    b = CreateProcess(program, params, NULL, NULL, FALSE, CREATE_NEW_CONSOLE|CREATE_UNICODE_ENVIRONMENT|NORMAL_PRIORITY_CLASS, env_block, NULL, &si, &pi);
    if (!b)
    {
          printf("No CreateProcess. Error:%d\n",GetLastError());
    }
   
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
    DestroyEnvironmentBlock(env_block);
   
    getchar();
}

#12
Hola, estoy intentando crear un proceso para una aplicación de consola, pero no quiero que el proceso creado herede las variables de entorno del proceso que lo crea, por eso quiero crear un bloque de proceso con solamente variables de sistema, sin embargo algo estoy haciendo mal porque CreateProcess me arroja error en el parámetro de la variable de entorno.


#include <windows.h>
#include <stdio.h>
#include <userenv.h>

int main()
{
    LPVOID env; 
    if (!CreateEnvironmentBlock(&env, NULL, FALSE))
    {
      printf("No CreateEnvironmentBlock. Error:%d\n",GetLastError());
    }
   
    PROCESS_INFORMATION pi;
    memset(&pi, 0, sizeof(pi));
   
    STARTUPINFO si;
    memset(&si, 0, sizeof(si));
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.lpTitle = "";
    si.wShowWindow = SW_NORMAL;
   
    LPTSTR program = TEXT("cmd.exe");
    LPTSTR params = TEXT("/c \"C:\\Users\\Carlos\\Desktop\\hola.cmd\"");
   
   BOOL b;
    b = CreateProcess(program, params, NULL, NULL, FALSE, CREATE_NEW_CONSOLE|NORMAL_PRIORITY_CLASS, env, NULL, &si, &pi);
    if (!b)
    {
          printf("No CreateProcess. Error:%d\n",GetLastError());
    }
   
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
   
    getchar();
}




¿Alguien podría ayudarme por favor?
#13
Publiqué nueva versión con cosas corregidas de la versión anterior.
Actualicé post principal.
#14
Listo, por fin una versión 1.0 con la característica antes mencionada.
#15
Hola, por favor ¿me podrían ayudar?

Estoy haciendo una aplicación de consola, y tengo un problema, quiero aceptar nombres unicode de los archivos, por si mi aplicación corre en algún windows en chino o algo así.

El asunto es que el main me da problemas:


#define UNICODE

#include <windows.h>
#include <stdio.h>

int main(int argc, TCHAR* argv[])
{
   
   if (argc == 2)
   {
      HANDLE archivo;
      int error;
     
      archivo = CreateFile(/*TEXT("texto.txt"),*/ argv[1],
                           GENERIC_READ,
                           FILE_SHARE_READ,
                           NULL, // Descriptor de seguridad por defecto
                           OPEN_EXISTING,
                           FILE_ATTRIBUTE_NORMAL,
                           NULL);
     
      error = GetLastError();
      if (error != NO_ERROR) {
         printf("Error: %d\n", error);
      }
      else
      {
         puts("No error");
      }
   }
   else
   {
       puts("Use only one argument");
   }
   
   return 0;
     
}



Así como está al especificar el nombre de archivo siempre me da error 2 (ERROR_FILE_NOT_FOUND), en cambio si descomento en el código y utilizo un nombre de archivo fijo existente, en este caso: texto.txt no da error.

A mi parecer el main es el que me da problemas, ¿cómo declaro un main que acepte unicode en la entrada?

He probado usando la cmd.exe en modo unicode:
cmd /u

y al especificar un nombre de archivo existente me da error 123 (ERROR_INVALID_NAME)

Entonces pienso que el problema está en la definición del main.
¿Por favor, alguien me puede ayudar? Tengo todo el resto del código listo para trabajar en unicode, pero me falta el poder aceptar un nombre de archivo desde el main, en este caso argv[1]

Estoy compilando con gcc 3.4.2 (mingw) bajo el ide Dev-C++ 4.9

EI: juntando mensajes.

busqué más información y leí que mingw no acepta wmain, así es que escribí esto como parche basado en: http://msdn.microsoft.com/en-us/library/bb776391%28v=VS.85%29.aspx



#ifdef UNICODE
int main()
#else
int main(int argc, UCHAR* argv[])
#endif
{
    #ifdef UNICODE
    TCHAR** argv;
    int argc;
    argv = CommandLineToArgvW(GetCommandLineW(), &argc);
    if (argv == NULL) {
      return ERROR_DESCONOCIDO;
    }
    #endif

    int ret;
    ret = mi_funcion(argv[1]);

    #ifdef UNICODE
    LocalFree(argv);
    #endif

    return ret;
}
#16
Ahora me doy cuenta de que con dos líneas de código puedo personalizar el ejecutable para poder ejecutarlo en modo: invisible, normal y maximizado.

¿A alguien le interesa esta característica?
#17
Scripting / CarlitosSoft Batch Compiler 1.3
1 Junio 2010, 02:46 AM
Nueva versión de CarlitosSoft Batch Compiler

Versión: 1.3
Características:

  • Genera ejecutables que se ejecutan en modo invisible, normal, maximizado y minimizado
  • Hasta el momento el ejecutable generado no es detectado por ningún antivirus, y no debería.
  • Si en el registro se activa DisableCMD para impedir la ejecución de la cmd.exe o de archivos batch el batch compilado se ejecuta igualmente. Único compilador batch con esta característica.
  • Sólo puede compilarse un archivo batch.
  • El código plano del batch no es mostrado dentro del ejecutable.
  • Si se ve la ventana de la cmd, esta tiene un título vacío y no aparece ningún menú de Propiedades.
  • Testeado exitosamente en Windows XP y Windows Seven.


Link:http://carlitossoft.110mb.com/cbc/
#18
Hola, quiero modificar un arreglo de cadena de caracteres, quiero asignarle al indice 0 de cada cadena un caracter, pero no funciona, ¿Alguien podría ayudarme?


#include <stdio.h>

int main()
{
char* listado[] = {
        "_:\\mi_listado.txt",
        "_:\\notas.txt",
        "_:\\p.txt"
};

int i;

for (i=0; i < 3; ++i)
{
     listado[i][0] = 'C';
     printf("%s\n",listado[i]);
}

getchar();
       
}
       

#19
Hola estoy usando el ide Dev-C++ para compilar lo siguiente, quiero usar unicode, pero no funciona.


#include <windows.h>

#define UNICODE

int main(int argc, char *argv[])
{
  TCHAR* ansi_o_unicode;
  WCHAR* unicode;
 
  unicode = L"unicode";
  ansi_o_unicode = TEXT("hola");
     
  return 0;
}

eso compila, pero si veo el ejecutable hola no está en unicode.
con un editor hexadecimal se ve así:

Código (dos) [Seleccionar]

hola..u.n.i.c.o.d.e..


y si quiero compilar lo siguiente no compila:


#include <windows.h>

#define UNICODE

int main(int argc, char *argv[])
{
  TCHAR* ansi_o_unicode;
  WCHAR* unicode;
 
  unicode = L"unicode";
  ansi_o_unicode = L"hola";
 
     
  return 0;
}


al parecer el #define UNICODE no es considerado porque si se consideraría debería compilar porque en la msdn se dice que dice que TCHAR es definido así:


#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif


¿Cual será el problema?

edito: ya lo encontré: tenía que definir UNICODE antes de incluir windows.h me da verguenza el error tonto de parte mía.
#20
gracias. Haciendo pruebas lo solucioné así:


#include <windows.h>

UCHAR* getUserSid();

int main(int argc, char *argv[])
{
   UCHAR* userSid;
   userSid = getUserSid();
   if (userSid != NULL)
   {
     printf("%s",userSid);
     free(userSid);
   }
   return 0;
}

UCHAR* getUserSid()
{
  HANDLE token = NULL;
  DWORD dwBufferSize = 0;
  PTOKEN_USER pTokenUser = NULL;
  HANDLE currentProcess = NULL;
  UCHAR* userSid = NULL;
 
  currentProcess = GetCurrentProcess();
  if (OpenProcessToken(currentProcess, TOKEN_QUERY, &token)) {
     GetTokenInformation(token, TokenUser, NULL, 0, &dwBufferSize);
     pTokenUser = (PTOKEN_USER)malloc(dwBufferSize);
     memset(pTokenUser, 0, dwBufferSize);
     if (GetTokenInformation(token, TokenUser, pTokenUser, dwBufferSize, &dwBufferSize)) {
        if (IsValidSid(pTokenUser->User.Sid)) {
           BOOL WINAPI ConvertSidToStringSidA(PSID, UCHAR*);
           ConvertSidToStringSidA(pTokenUser->User.Sid, (UCHAR*)&userSid);
        }
     }
     free(pTokenUser);
     CloseHandle(token);
  }
  CloseHandle(currentProcess);
  return userSid;
}