0x000006ba error si abre una cola existente en un servidor Virtual

Síntomas

Si abre una cola existente en un servidor virtual, recibirá un error 0x000006ba .

Causa

Un recurso de clúster DLL se ejecuta en el contexto del nodo local. Sin embargo, si se genera un nuevo proceso desde la DLL de recursos, el nuevo proceso se ejecuta en el contexto del clúster. Message Queue Server (también conocido como MSMQ) llamadas se realizan desde el proceso de nuevo.

Solución alternativa

Para evitar este problema, siga estos pasos:
  1. Crear una DLL de recursos personalizado en Microsoft Visual Studio 6.0.
  2. Agregue el código siguiente al bucle de do...while() en la llamada xxxOnlineThread() (detección de errores se quitará el código de ejemplo):
    RESOURCE_STATUS      resourceStatus;DWORD                nStatus;
    STARTUPINFO StartupInfo;
    PROCESS_INFORMATION Process;
    LPWSTR pszNameOfPropInError;
    LPWSTR pszExpandedDir = NULL;
    LPWSTR pszExpandedCommand = NULL;

    // Create Process parameters
    LPVOID Environment = NULL;
    HANDLE processToken;
    HANDLE currentProcess;
    HANDLE hEventLog;
    DWORD nStatus = ResUtilGetPropertiesToParameterBlock(
    pResourceEntry->hkeyParameters,
    GenAppResourcePrivateProperties,
    reinterpret_cast<LPBYTE>( &pResourceEntry->props ),
    TRUE, // CheckForRequiredProperties
    &pszNameOfPropInError
    );
    // Perform resource-specific initialization before starting the app.
    if ( pResourceEntry->props.nUseNetworkName ) {
    // Create the new environment with the simulated net name.

    LPVOID Environment = NULL;
    Environment = ResUtilGetEnvironmentWithNetName(pResourceEntry->hResource);
    }
    else {

    // get the current process token. If it fails, revert to using just the
    // system environment area
    currentProcess = GetCurrentProcess();
    OpenProcessToken(currentProcess, MAXIMUM_ALLOWED, &processToken);
    // Clone the current environment, picking up any changes that might have
    // been made after resmon started
    CreateEnvironmentBlock(&Environment, processToken, FALSE);
    // Expand the current directory parameter
    if (pResourceEntry->props.pszCurrentDirectory) {
    pszExpandedDir = xxxExpandEnvironmentStrings(pResourceEntry->props.pszCurrentDirectory);
    }
    // Try to start the new process
    CreateProcess(<Enter Executable Name Here>,
    NULL, NULL, NULL, FALSE,
    CREATE_UNICODE_ENVIRONMENT,
    Environment, pszExpandedDir, &StartupInfo,
    &Process);
Nota: "Xxx" en la llamada de función (pszExpandedDir = xxxExpandEnvironmentStrings (pResourceEntry -> props.pszCurrentDirectory) se corresponde con el nombre de la DLL de recursos.

Este código hace lo siguiente:
  • El código establece el bloque de entorno con la propiedad UseNetnameAsComputerName (ResUtilGetEnvironmentWithNetName(...)).
  • El código guarda esta información en el bloque de entorno para el proceso (CreateEnvironmentBlock(...)).
  • El código crea un nuevo proceso que se ejecuta en el contexto del servidor virtual (CreateProcess(...)).

Hacer llamadas por Message Queue Server en este nuevo proceso.

Estado

Este comportamiento es por diseño.
Propiedades

Id. de artículo: 305794 - Última revisión: 22 ene. 2017 - Revisión: 1

Comentarios