ID do artigo: 131462 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 4.3

Como manipular FNERR_BUFFERTOOSMALL no Windows

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Recolher tudo

Sumário

Quando um aplicativo usa a caixa de diálogo Abrir arquivo comum com o sinalizador OFN_ALLOWMULTISELECT, há um perigo que o buffer passado para a caixa de diálogo comuns no campo OPENFILENAME.lpstrFile será muito pequeno. Nessa situação, GetOpenFileName() retornará um valor de erro e CommDlgExtendedError() retornará FNERR_BUFFERTOOSMALL.

Mais Informações

Quando você instala um gancho na caixa de abrir arquivo comuns diálogo usando o membro OPENFILENAME.lpfnHook, a caixa de diálogo que são conectando é um filho da caixa de diálogo Abrir arquivo principal. Em CDN_SELCHANGE, você deve verificar se o buffer alocado originalmente é grande o suficiente para lidar com todos os arquivos selecionados. Você deve realocar o buffer se necessários e liberar o buffer alocado anterior para evitar vazamentos de memória.

Aqui está um exemplo de procedimento subclasse:
extern "C"
{
WNDPROC* g_lpfnDialogProc =NULL;


unsigned int CALLBACK DialogHook(HWND hwnd, UINT uMsg, WPARAM wParam,
                          LPARAM lParam)
{
	static HWND hwndParentDialog;
	LPOFNOTIFY lpofn;
	int cbLength;
	static LPTSTR lpsz;
	static int LastLen;
	
	switch (uMsg)
	{
	case WM_INITDIALOG:
          // You need to use a copy of the OPENFILENAME struct used to
          // create this dialog. You can store a pointer to the
          // OPENFILENAME struct in the ofn.lCustData so you can
          // retrieve it here in the lParam. Once you have it, you
          // need to hang on to it. Using window properties provides a
          // good thread safe solution to using a global variable.

          if(!SetProp(GetParent(hwnd), "OFN", (void *) lParam))
	  MessageBox(NULL, "SET PRop Failed", "ERROR", MB_OK);
          return (0);

	  case WM_COMMAND:
		  {
			OutputDebugString("command\n");
		  }
		  break;
      case WM_NOTIFY:
          // The OFNOTIFY struct is passed in the lParam of this
          // message.

          lpofn = (LPOFNOTIFY) lParam;

          switch (lpofn->hdr.code)
          {
 	  	case CDN_SELCHANGE:
			  
		LPOPENFILENAME lpofn;
		cbLength = CommDlg_OpenSave_GetSpec(GetParent(hwnd), NULL, 0);
		  
		cbLength += _MAX_PATH;
		
   	     // The OFN struct is stored in a property of dialog window
			  		  
		lpofn = (LPOPENFILENAME) GetProp(GetParent(hwnd),
						  "OFN");
			
		if (lpofn->nMaxFile < cbLength)  

		{
			  // Free the previously allocated buffer.
			  if(lpsz)
				  HeapFree(GetProcessHeap(),
							0,
 				 	                lpsz);
  			 // Allocate a new buffer
			  lpsz = (LPTSTR) HeapAlloc(GetProcessHeap(),
						HEAP_ZERO_MEMORY,
						cbLength);
			  if (lpsz)
			  {
					  
				  lpofn->lpstrFile = lpsz;
				  lpofn->nMaxFile  = cbLength;
			  }
		  }
		  break;
			  
         }
          return (0);

      case WM_DESTROY:

          // Also need to free the property with the OPENFILENAME
          // struct.
          RemoveProp(GetParent(hwnd), "OFN");
          return (0);
  }
  return (0);
} 
				
por último, essa técnica funciona somente para aplicativos de 32 bits que estejam usando caixas de diálogo comuns de tipo Explorer.

Windows 95/98: Para aplicativos de 32 bits que não usam o sinalizador OFN_EXPLORER, ele thunks para a caixa de diálogo comuns 16 bits e a função de gancho só obtém uma cópia da estrutura OPENFILENAME.

Windows NT/2000: Aplicativos devem usar a versão Unicode da caixa de diálogo comum abrir arquivo. Por exemplo, usar OPENFILENAMEW estrutura e chamar GetOpenFileNameW API. Esta solução alternativa não funcionará para a versão ANSI caixa de diálogo comum abrir arquivo.

A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32 nas seguintes plataformas
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
Palavras-chave: 
kbmt kbcmndlgfileo kbhowto KB131462 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 131462  (http://support.microsoft.com/kb/131462/en-us/ )