Artigo: 131462 - Última revisão: terça-feira, 21 de Novembro de 2006 - Revisão: 4.3

Como processar 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 | Reduzir tudo

Sumário

Quando uma aplicação utiliza a caixa de diálogo comum do ficheiro abrir com o sinalizador OFN_ALLOWMULTISELECT, existe um perigo que a memória intermédia transmitida para a caixa de diálogo comuns campo OPENFILENAME.lpstrFile ser demasiado pequena. Nesta situação, GetOpenFileName() devolverá um valor de erro e CommDlgExtendedError() devolverá FNERR_BUFFERTOOSMALL.

Mais Informação

Quando instala uma rotina na caixa de abrir um ficheiro comum diálogo utilizando o membro OPENFILENAME.lpfnHook, caixa de diálogo que estiver a ligar é um subordinado a caixa de diálogo Abrir ficheiro principal. CDN_SELCHANGE, deverá verificar se a memória intermédia originalmente atribuída é suficientemente grande para processar todos os ficheiros seleccionados. Deve atribuir a memória intermédia se necessários e libertar a memória intermédia atribuída anterior para impedir fugas 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, esta técnica só funciona para aplicações de 32 bits que estiverem a utilizar caixas de diálogo Tipo de Explorer comuns.

Windows 95/98: Para aplicações de 32 bits que não utilizam o sinalizador OFN_EXPLORER, thunks à caixa de diálogo comuns 16-bit e a função de hook só obtém uma cópia da estrutura OPENFILENAME.

Windows NT/2000: As aplicações devem utilizar a versão Unicode a caixa de diálogo comum abrir ficheiro. Por exemplo, utilizar OPENFILENAMEW estrutura e chamar GetOpenFileNameW API. Esta solução alternativa não irá funcionar para a versão ANSI do diálogo comuns de ficheiro aberto.

A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Application Programming Interface 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )