Partilhar via


Como lidar com a Ajuda Online

A ajuda on-line pode vir em uma variedade de formas, desde informações conceituais detalhadas até definições rápidas. Este tópico contém as seguintes seções.

Sobre a Ajuda

Um elemento importante de uma aplicação de fácil utilização está prontamente disponível na ajuda em linha. O Windows fornece funções e mensagens que, quando usadas em conjunto com o aplicativo de Ajuda do Windows, facilitam a implementação da ajuda online em seu aplicativo. Esta visão geral discute os elementos do Windows que oferecem suporte à ajuda online. Ele descreve como usar esses elementos para dar aos usuários um meio de solicitar ajuda e explica como usar o aplicativo de Ajuda do Windows para exibir a ajuda.

Pedidos de Ajuda

A maioria dos aplicativos baseados no Windows fornece informações de ajuda on-line em uma variedade de formas, desde ajuda conceitual que explica a finalidade dos recursos de um aplicativo até ajuda pop-up que fornece definições rápidas de elementos individuais na interface do usuário do aplicativo. Você usa funções e mensagens para oferecer aos usuários várias maneiras de solicitar acesso a essas informações. As seções a seguir descrevem essas solicitações de ajuda.

Menu Ajuda

A maioria dos aplicativos fornece ao usuário acesso às informações de ajuda incluindo um menu de de Ajuda na janela principal. Quando o usuário seleciona um item de um menu de da Ajuda do, o procedimento da janela correspondente recebe uma mensagem de WM_COMMAND que identifica o item selecionado. O aplicativo responde exibindo as informações de ajuda apropriadas, como uma lista de tópicos de ajuda, um índice ou uma introdução ao aplicativo.

Ajuda do teclado

O Windows fornece ao usuário acesso às informações de ajuda do teclado, notificando o aplicativo sempre que o usuário pressiona a tecla F1. O sistema envia uma mensagem WM_HELP para a janela que tinha o foco do teclado quando o usuário pressionou a tecla. Se a janela for uma janela filha (por exemplo, um controle em uma caixa de diálogo), a função DefWindowProc passa a mensagem para a janela mãe. Se um menu estiver ativo quando F1 for pressionado, o sistema enviará a mensagem para a janela associada ao menu. O aplicativo responde exibindo informações de ajuda associadas à janela, controle ou menu que tem o foco ou está ativo. Por exemplo, se o usuário seleciona um controle em uma caixa de diálogo e pressiona F1, o aplicativo exibe informações de ajuda para esse controle.

O parâmetro lParam de WM_HELP é um ponteiro para uma estrutura HELPINFO, que contém informações detalhadas sobre o item para o qual a ajuda é solicitada. Use essas informações para determinar o tópico de ajuda a ser exibido. A estrutura HELPINFO também inclui as coordenadas do cursor do mouse no momento em que o usuário pressionou a tecla. Você pode usar essas informações para fornecer ajuda com base na localização do cursor do mouse.

Ajuda do rato

O Windows fornece ao usuário acesso a informações de ajuda do mouse, notificando o aplicativo sempre que o usuário clica no botão direito do mouse ou clica em uma janela, controle ou menu depois de clicar no botão Pergunta (?). O aplicativo responde exibindo informações de ajuda associadas à janela, controle ou menu fornecidos.

O sistema envia uma mensagem WM_CONTEXTMENU quando o usuário clica no botão direito do mouse. A janela que foi clicada recebe a mensagem. Se a janela for uma janela filha, como um controle, a função DefWindowProc passa a mensagem para a janela pai. A mensagem WM_CONTEXTMENU especifica as coordenadas do cursor do mouse. A coordenada x está na palavra de ordem baixa do parâmetro lParam, e a coordenada y está na palavra de ordem alta. Se o usuário clicou em um controle, o parâmetro wParam é o identificador para o controle que recebeu o clique.

O sistema envia uma mensagem WM_HELP quando o usuário clica em um item em uma janela depois de clicar no botão Pergunta (?) que aparece na barra de título da janela. Você pode adicionar um botão Pergunta a uma barra de título especificando o estilo WS_EX_CONTEXTHELP na funçãoCreateWindowExao criar a janela. O parâmetro lParam de WM_HELP é um ponteiro para uma estrutura de HELPINFO que contém informações detalhadas sobre o item para o qual a ajuda é solicitada, incluindo as coordenadas do cursor do mouse no momento em que o usuário pressionou o botão do mouse.

O botão Pergunta é recomendado para uso apenas em caixas de diálogo. No passado, as aplicações forneciam aos utilizadores acesso a informações de ajuda sobre uma caixa de diálogo, através de um botão Ajuda na caixa de diálogo. Este método já não é recomendado. Em vez disso, use o botão Pergunta.

Exibição de Ajuda e Ajuda do Windows

Assim que um aplicativo receber um pedido de ajuda, ele deverá exibir as informações de ajuda apropriadas. Como o aplicativo de Ajuda do Windows fornece uma interface de usuário consistente, é recomendável que os aplicativos usem a Ajuda do Windows em vez de outros métodos. Para direcionar a Ajuda do Windows para exibir informações de ajuda, um aplicativo usa a função WinHelp, especificando detalhes como as informações a serem exibidas e a forma da janela na qual elas serão exibidas. As seções a seguir explicam como usar WinHelp para exibir informações de ajuda.

Ficheiros de ajuda

Para exibir informações de ajuda, você deve especificar um arquivo de ajuda ao chamar a funçãoWinHelp. O arquivo de ajuda deve ter o formato de arquivo de Ajuda do Windows (.hlp) e um ou mais tópicos. Cada tópico é uma unidade distinta de informação, como uma descrição conceitual, um conjunto de instruções, uma imagem, uma definição de glossário e assim por diante. Os tópicos devem ser identificados exclusivamente para que a Ajuda do Windows possa localizá-los sempre que solicitados. Internamente, a Ajuda do Windows usa identificadores de tópico para localizar tópicos, mas os aplicativos geralmente usam identificadores de contexto (valores inteiros exclusivos) para especificar os tópicos a serem exibidos. O autor do arquivo de ajuda deve mapear explicitamente identificadores de contexto para identificadores de tópico na seção [MAP] do arquivo de projeto usado para criar o arquivo de ajuda.

Quando você especifica um arquivo de ajuda, mas não especifica um caminho, WinHelp procura o arquivo de ajuda no diretório de ajuda ou em um diretório especificado pela variável de ambiente PATH. Além disso, WinHelp pode encontrar um arquivo de ajuda cujo nome está listado no seguinte local do Registro:

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            Help

Para tirar proveito do registro, você deve criar um nome de valor que tenha o mesmo nome do arquivo de ajuda. O valor atribuído a esse nome deve ser o diretório onde reside o arquivo de ajuda.

Se WinHelp não conseguir encontrar o arquivo de ajuda fornecido, ele exibirá uma caixa de diálogo que permite ao usuário especificar o local do arquivo de ajuda. Como WinHelp salva as informações de local no registro, ele não solicita novamente o local do mesmo arquivo de ajuda.

Para obter mais informações sobre como criar e criar um arquivo de ajuda, consulte a documentação fornecida com suas ferramentas de desenvolvimento.

Iniciando a Ajuda do Windows

O exemplo a seguir usa a função WinHelp para iniciar a aplicação de Ajuda do Windows e abrir o arquivo de ajuda no tópico Conteúdos.

HWND hwnd;     // main window handle 
BOOL bResult   // for checking Boolean function result 

bResult = WinHelp(hWnd, "WINNT.HLP", HELP_CONTENTS, 0L);

Este próximo exemplo abre o arquivo de ajuda do usuário, pesquisa o arquivo para o tópico associado a uma cadeia de caracteres de palavra-chave e, em seguida, exibe o tópico.

HWND hwnd;     // main window handle 
BOOL bResult   // for checking Boolean function result 

bResult = WinHelp(hWnd, "WINNT.HLP", HELP_KEY, (DWORD) "finding topics");

Caixa de diálogo Tópicos da Ajuda

Você pode exibir a caixa de diálogo Tópicos da Ajuda chamando a função WinHelp com o comando HELP_FINDER. A caixa de diálogo Tópicos da Ajuda do permite que o usuário selecione tópicos a serem exibidos exibindo os títulos dos tópicos, as palavras-chave associadas aos tópicos ou as palavras e frases encontradas nos tópicos. Os aplicativos geralmente exibem essa caixa de diálogo quando o usuário escolhe um comando, como Tópicos da Ajuda, no menu Ajuda. Um aplicativo também pode exibir essa caixa de diálogo se o usuário pressionar a tecla quando nenhuma janela, controle ou menu específico no aplicativo tiver o foco ou estiver ativo.

No passado, os aplicativos usavam os comandos HELP_CONTENTS e HELP_INDEX com a função WinHelp para exibir o tópico Conteúdo e o índice de palavras-chave do arquivo de Ajuda. Esses comandos não são mais recomendados. Em vez disso, use o comando HELP_FINDER.

Tópicos de informação

Você pode exibir um tópico específico chamando a função WinHelp com o comando HELP_CONTEXT e especificando o identificador de contexto para o tópico. Os aplicativos normalmente usam o comando HELP_CONTEXT em resposta a solicitações do usuário para tópicos que contêm informações conceituais ou ajuda processual, em vez de informações sobre um controle ou menu específico. Nesses casos, o usuário pode continuar a navegar no arquivo de ajuda procurando informações relacionadas antes de retornar ao aplicativo.

O comando HELP_CONTEXT invoca uma instância regular da Ajuda do Windows, permitindo que o usuário encontre outros tópicos no arquivo de ajuda. Ele normalmente exibe a janela principal da Ajuda, que inclui uma barra de título, um menu do sistema, botões de minimização e maximização, um menu principal, uma barra de navegação opcional, uma borda de dimensionamento e uma área do cliente. O texto do tópico selecionado aparece na área do cliente e o usuário pode navegar pelo arquivo de ajuda usando hot links ou botões de navegação na janela principal. A instância regular da Ajuda do Windows também pode ser usada para exibir a ajuda em uma ou mais janelas secundárias em vez da janela principal.

Tópicos Emergentes

Você pode exibir um tópico pop-up que contém informações para um controle ou menu específico chamando a função WinHelp com o comando HELP_WM_HELP ou HELP_CONTEXTMENU. Esses comandos exibem um tópico em uma janela pop-up perto do controle ou menu correspondente. Para permitir que o usuário volte imediatamente ao trabalho no aplicativo, a janela pop-up é destruída assim que o usuário pressiona uma tecla ou clica no botão esquerdo do mouse.

Use o comando HELP_WM_HELP ao processar mensagens WM_HELP para janelas de controle. Como a maioria dos controles passa a mensagem WM_HELP para a funçãoDefWindowProc do, o procedimento de caixa de diálogo correspondente (ou procedimento de janela pai) processa essa mensagem. Em vez de fornecer um identificador de contexto específico, o procedimento da caixa de diálogo deve passar uma matriz de pares de controle e identificador de contexto para WinHelp juntamente com o identificador de controle especificado no hItemHandle membro da estrutura deHELPINFOpassada com a mensagem WM_HELP. A função determina o identificador do controle para o qual a mensagem WM_HELP foi gerada e usa o identificador de contexto correspondente para exibir o tópico apropriado.

Utilize o comando HELP_CONTEXTMENU ao processar mensagens WM_CONTEXTMENU. Como a maioria dos controles passa a mensagem WM_CONTEXTMENU para a funçãoDefWindowProc do, o procedimento de caixa de diálogo correspondente (ou procedimento de janela pai) processa essa mensagem. O procedimento especifica uma matriz de pares de identificador de controle e contexto; ele também especifica o identificador no parâmetro wParam ao chamar WinHelp para que a função possa escolher o identificador de contexto apropriado da matriz e exibir o tópico apropriado. Ao contrário do comando HELP_WM_HELP, o HELP_CONTEXTMENU exibe primeiro o comando O que é isto? em um menu. Se o usuário escolher o comando, WinHelp exibirá o tópico. Caso contrário, o pedido é cancelado.

Você também pode exibir tópicos pop-up usando o comando HELP_CONTEXTPOPUP e especificando um identificador de contexto do tópico. Este comando é semelhante ao comando HELP_CONTEXT, mas invoca a instância pop-up da Ajuda do Windows usada por HELP_WM_HELP e HELP_CONTEXTMENU. Os aplicativos podem usar esse comando em resposta a mensagens WM_HELP para exibir ajuda para menus e janelas que não são controles em uma caixa de diálogo. Para usar esse comando de forma mais eficaz, o aplicativo deve atribuir identificadores de contexto a esses menus e janelas.

Você pode atribuir um identificador de contexto a qualquer janela ou menu no aplicativo. Quando uma mensagem WM_HELP é gerada, o sistema inclui o identificador de contexto na estrutura HELPINFO que é passada para a janela pai na mensagem WM_HELP. A janela pai pode então passar o identificador de contexto para WinHelp para exibir o tópico de ajuda solicitado.

Use a funçãoSetWindowContextHelpId para atribuir um identificador de contexto a uma janela ou controle e a função SetMenuContextHelpId para atribuir um identificador de contexto a um menu. Você pode recuperar o identificador de contexto de uma janela ou menu usando a função GetWindowContextHelpId ou a função GetMenuContextHelpId .

Pesquisas por palavras-chave

Você pode permitir que o usuário encontre e visualize tópicos atribuindo palavras-chave a tópicos no arquivo de ajuda. Uma palavra-chave é simplesmente uma cadeia de caracteres associada a um ou mais tópicos. A Ajuda do Windows recolhe todas as palavras-chave num ficheiro de ajuda, coloca-as numa tabela e apresenta-as na lista Índice da caixa de diálogo Tópicos da Ajuda. Quando o usuário seleciona uma palavra-chave, a Ajuda do Windows exibe o tópico de ajuda associado ou, se houver mais de um tópico associado à palavra-chave, exibe uma lista de tópicos dos quais o usuário pode escolher.

Em um aplicativo, você pode usar o comando HELP_KEY, HELP_PARTIALKEY ou HELP_MULTIKEY com a função WinHelp para pesquisar e exibir tópicos de ajuda com base em palavras-chave totais ou parciais. Você especifica o comando, a cadeia de caracteres de palavra-chave, o arquivo de ajuda e o identificador para a janela do proprietário. Em todos os casos, se uma única correspondência for encontrada, WinHelp exibirá o tópico correspondente. Se mais de uma correspondência for encontrada, a função exibirá a caixa de diálogo Tópicos encontrados e o usuário poderá escolher qual tópico exibir. Se nenhuma correspondência for encontrada, WinHelp exibirá a lista Índice (para HELP_KEY e HELP_PARTIALKEY) ou exibirá uma mensagem de erro (para HELP_MULTIKEY).

Seu aplicativo pode pesquisar várias palavras-chave em uma única chamada para WinHelp separando as palavras-chave com ponto-e-vírgula. (A pesquisa de várias palavras-chave não é suportada para ficheiros de ajuda criados para o Windows versão 3.x) Ele também pode pesquisar palavras-chave em vários arquivos de ajuda se o arquivo de ajuda especificado tiver um arquivo contents(.cnt) que contenha os comandos :Index ou :Link. Com o comando HELP_KEY, WinHelp procura palavras-chave em todos os arquivos especificados por esses comandos. Com os comandos HELP_MULTIKEY e HELP_PARTIALKEY, a função pesquisa todos os arquivos, exceto os especificados pelos comandos :Link.

Por padrão, a Ajuda do Windows reconhece apenas a tabela de palavras-chave identificada pelo caractere de nota de rodapé K no arquivo de origem da ajuda. Você pode direcionar a Ajuda do Windows para criar tabelas de palavras-chave adicionais adicionando um caractere de nota de rodapé diferente de K, com a definição de palavra-chave, no arquivo de origem da ajuda. (O caractere A da nota de rodapé, no entanto, é reservado.) Você deve definir quaisquer tabelas de palavras-chave adicionais usando instruções MULTIKEY na seção [OPTIONS] do arquivo de projeto ao criar o arquivo de ajuda.

Um aplicativo pode usar o comando HELP_SETINDEX com a função WinHelp para direcionar a Ajuda do Windows para exibir uma tabela de palavras-chave diferente de K em sua lista de índice. Para direcionar a Ajuda do Windows para pesquisar uma palavra-chave em uma tabela de palavras-chave alternativas, um aplicativo pode usar o comando HELP_MULTIKEY. Você especifica a palavra-chave e a tabela de palavras-chave em uma estrutura MULTIKEYHELP, que você passa para WinHelp.

Quando WinHelp exibe um tópico, ele o exibe na janela especificada pela nota de rodapé ">" para o tópico, na janela especificada pelo comando :Base no arquivo de conteúdo ou na janela principal. Se a janela principal já estiver aberta para um arquivo de ajuda diferente quando você chamar WinHelp, a função ocultará a janela principal durante a pesquisa. Quando se cancelam as caixas de diálogo Tópicos Encontrados e Tópicos de Ajuda, fecha-se a janela principal.

Janelas de Ajuda secundárias

A janela principal do aplicativo de Ajuda do Windows é chamada de janela primária. A Ajuda do Windows também pode exibir tópicos de ajuda em uma janela secundária. Ao contrário da janela principal da Ajuda, uma janela secundária não contém uma barra de menus. Pode incluir uma barra de navegação numa janela secundária e adicionar botões à barra. Você também pode optar por fazer com que a Ajuda do Windows ajuste automaticamente a altura da janela secundária para acomodar o tópico.

Você deve definir janelas secundárias na seção [WINDOWS] do seu arquivo de projeto de ajuda, fornecendo o nome e, opcionalmente, o tamanho inicial e a posição de cada janela. Você pode direcionar o aplicativo de Ajuda do Windows para exibir um tópico em uma janela secundária anexando um colchete angular (>) e o nome que você definiu para a janela secundária ao nome do arquivo de ajuda. A cadeia de caracteres resultante é então passada para a função WinHelp.

Uma aplicação pode alterar o tamanho e a posição de uma janela primária ou secundária especificando o endereço de uma estrutura HELPWININFO e o comando HELP_SETWINPOS numa chamada para WinHelp. HELPWININFO especifica o nome da janela e seu novo tamanho e posição.

Ajuda do cartão de treinamento

Usando a ajuda do cartão de treinamento, um aplicativo pode exibir uma sequência de instruções para guiar o usuário pelas etapas de uma tarefa. Um cartão de treinamento geralmente consiste em texto que explica uma etapa específica e botões associados a macros TCard, que permitem que o usuário diga ao aplicativo o que fazer em seguida. Os cartões de treinamento só podem ser exibidos em janelas secundárias e não devem conter hot links para outros tópicos no arquivo de ajuda.

Um aplicativo inicia a instância do cartão de treinamento da Ajuda do Windows chamando a função WinHelp e especificando o comando HELP_TCARD em combinação com outro comando, como HELP_CONTEXT. Posteriormente, quando o usuário clica em um botão no cartão de treinamento, clica em um ponto de acesso atribuído à macro TCard ou fecha o cartão de treinamento, a Ajuda do Windows notifica o aplicativo enviando-lhe uma mensagem WM_TCARD. O parâmetro wParam identifica o botão ou a ação do usuário, e o parâmetro lParam contém dados adicionais, cujo significado depende do valor de wParam.

Cancelar Ajuda

A Ajuda do Windows exige que um aplicativo cancele explicitamente a ajuda para que ele possa liberar todos os recursos usados para acompanhar o aplicativo e seus arquivos de ajuda. O aplicativo pode fazer isso a qualquer momento, chamando a função WinHelp e especificando o comando HELP_QUIT. Observe que isso não é verdade para a instância pop-up da Ajuda do Windows. Uma aplicação não deve tentar fechar uma janela pop-up.

Se um aplicativo tiver feito chamadas para WinHelp, ele deve cancelar a ajuda antes de fechar sua janela principal (por exemplo, em resposta à mensagem WM_DESTROY no procedimento da janela principal). Um aplicativo precisa ligar para WinHelp apenas uma vez para cancelar a ajuda, não importa quantos arquivos de ajuda ele tenha aberto. A Ajuda do Windows permanece em execução até que todos os aplicativos ou DLLs tenham cancelado a ajuda.

Para fechar a instância do cartão de treinamento da Ajuda do Windows, você deve especificar os comandos HELP_TCARD e HELP_QUIT ao chamar WinHelp. Um aplicativo não precisa cancelar a instância do cartão de treinamento da Ajuda do Windows se o usuário cancelá-la primeiro. A Ajuda do Windows notifica um aplicativo quando o usuário cancela a instância do cartão de treinamento enviando a mensagem WM_TCARD com o parâmetro wParam definido como IDCLOSE.

Utilizar a Ajuda

Esta seção mostra como fornecer ajuda contextual para uma caixa de diálogo e como definir a aparência de uma janela secundária da Ajuda.

Fornecendo ajuda em uma caixa de diálogo

Para fornecer ajuda contextual numa caixa de diálogo, deve criar uma matriz que consiste em pares de valores DWORD . O primeiro valor em cada par é o identificador de um controle na caixa de diálogo e o segundo é o identificador de contexto do tópico de ajuda para o controle. A matriz deve conter um par de identificadores para cada controle na caixa de diálogo.

O procedimento da caixa de diálogo deve processar as mensagens WM_HELP e WM_CONTEXTMENU. O procedimento da caixa de diálogo recebe WM_HELP quando o usuário pressiona a tecla e WM_CONTEXTMENU quando o usuário clica no botão direito do mouse.

O parâmetro lParam de WM_HELP contém o endereço de uma estrutura HELPINFO. O hItemHandle membro dessa estrutura identifica o controle para o qual o usuário solicitou ajuda. Você deve passar esse identificador para a função WinHelp juntamente com o comando HELP_WM_HELP, o nome do arquivo de ajuda e um ponteiro para a matriz de identificadores. A função WinHelp procura na matriz o identificador de controle do controle especificado e, em seguida, recupera o identificador de contexto de ajuda correspondente. Em seguida, a função passa o identificador de contexto da ajuda para a Ajuda do Windows, que localiza o tópico correspondente e o exibe em uma janela pop-up. Se o controlo tiver um identificador de -1, o sistema procurará o próximo controlo que seja uma paragem de tabulação e, em seguida, usará o seu identificador para encontrar o identificador de contexto de ajuda. Por esse motivo, é importante que você coloque texto estático antes dos controles em um arquivo de recurso.

Ao chamar a função WinHelp, o processamento WM_CONTEXTMENU é semelhante ao processamento WM_HELP com estas duas exceções:

  • Você passa o parâmetro wParam de WM_CONTEXTMENU, que é o identificador para o controle que enviou a mensagem.
  • Você especifica o comando HELP_CONTEXTMENU em vez de HELP_WM_HELP.

O comando HELP_CONTEXTMENU faz com que a Ajuda do Windows exiba um menu antes de exibir o tópico da Ajuda. O menu é definido pelo sistema. Ele permite que o usuário exiba ajuda para o controle ou exiba a caixa de diálogo Tópicos da Ajuda .

O exemplo a seguir mostra como implementar a ajuda contextual em uma caixa de diálogo.

LRESULT CALLBACK EditDlgProc(HWND hwndDlg, UINT uMsg, 
                             WPARAM wParam, LPARAM lParam) 
{ 
    // Create an array of control identifiers and context identifiers. 
    static DWORD aIds[ ] = 
    { 
        ID_SAVE,   IDH_SAVE, 
        ID_DELETE, IDH_DELETE, 
        ID_COPY,   IDH_COPY, 
        ID_PASTE,  IDH_PASTE, 
        0,0 
    }; 

    switch (uMsg) 
    { 
        case WM_HELP: 
            WinHelp(((LPHELPINFO)lParam)->hItemHandle, "helpfile.hlp", 
                    HELP_WM_HELP, (DWORD)(LPSTR)aIds); 
            break; 

        case WM_CONTEXTMENU: 
            WinHelp((HWND)wParam, "helpfile.hlp", HELP_CONTEXTMENU, 
                    (DWORD)(LPVOID)aIds); 
            break; 
        
        // Process other messages here. 
    } 
    return FALSE; 
}

Definindo a aparência de uma janela de Ajuda secundária

Um aplicativo pode definir o tamanho, a posição e o estado de exibição de uma janela de ajuda secundária passando o comando HELP_SETWINPOS e o endereço de uma estrutura HELPWININFO para a função WinHelp. Os membros do HELPWININFO especificam o nome da janela a ser alterada e o novo tamanho, posição e estado de exibição da janela.

O exemplo a seguir define a aparência de uma janela secundária chamada "wnd_menu". O nome deve ser definido na seção [WINDOWS] do arquivo de projeto de ajuda.

BOOL DoWindowSize(VOID) 
{ 
    HANDLE hhwi; 
    LPHELPWININFO lphwi; 
    WORD wSize; 
    char *szWndName = "wnd_menu"; 
    size_t NameLength;      // Does not include the terminating null character
    HRESULT hr
    BOOL retval;

    hr = StringCbLengthA(szWndName, STRSAFE_MAX_CCH, &NameLength);
    
    if (SUCCEEDED(hr))
    {
        // Add 1 to account for the name string's terminating null character.
        NameLength++;
        
        // The HELPWININFO structure contains a minimal TCHAR array of size [2] 
        // that is used for the window name. Since sizeof(HELPWININFO) 
        // includes those two TCHARS, they must be subtracted from the 
        // total when adding the actual string length to calculate the  
        // size of the structure. 
        wSize = sizeof(HELPWININFO) - 2 + NameLength; 
    }
    else
        // Something's amiss with the string.
        return FALSE;
        
    hhwi  = GlobalAlloc(GHND, wSize); 
    lphwi = (LPHELPWININFO)GlobalLock(hhwi); 

    lphwi->wStructSize = wSize; 
    lphwi->x    = 256;      // horizontal position 
    lphwi->y    = 256;      // vertical position 
    lphwi->dx   = 767;      // width 
    lphwi->dy   = 512;      // height 
    lphwi->wMax = SW_SHOW;  // show the window 
    
    // secondary window
    hr = StringCbCopyA(lphwi->rgchMember, sizeof(lphwi->rgchMember), szWndName);
    
    if (SUCCEEDED(hr))
    {
        WinHelp(hwnd, "myhelp.hlp", HELP_SETWINPOS, (DWORD)lphwi); 
     
        GlobalUnlock(hhwi); 
        GlobalFree(hhwi); 

        return TRUE; 
    }
    else
        // There was a problem copying the window name.
        return FALSE;
}