Makale numarası: 131462 - Son Gözden Geçirme: 21 Kasım 2006 Salı - Gözden geçirme: 4.3

Nasıl yapılır: Windows FNERR_BUFFERTOOSMALL tanıtıcı

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.
Hepsini aç | Hepsini kapa

Özet

Bir uygulama OFN_ALLOWMULTISELECT bayrağıyla açık dosya ortak iletişim kutusu kullandığında, ortak iletişim OPENFILENAME.lpstrFile alanındaki geçirilen arabellek çok küçük için bir tehlike bulunmaktadır. Bu durumda, GetOpenFileName() hata değerini döndürür ve CommDlgExtendedError() FNERR_BUFFERTOOSMALL döndürecektir.

Daha fazla bilgi

Bir kanca OPENFILENAME.lpfnHook üye kullanarak Open File ortak iletişim kutusunda, takma, iletişim ana dosya Aç iletişim kutusunun alt yüklemektir. CDN_SELCHANGE içinde başlangıçta ayrılan arabelleğe seçilen tüm dosyaları işlemek için yeterli büyüklükte olup olmadığını denetlemelisiniz. Arabellek, tahsis gerekli ve Bellek sızıntılarını önlemek için önceki ayrılmış arabelleğe boşaltın.

Alt yordamı örneği şöyledir:
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);
} 
				
finally, bu yöntem yalnızca Explorer türü ortak iletişim kutularının kullanan 32 bitlik uygulamalar için çalışır.

Windows 95/98: OFN_EXPLORER bayrağı kullanan 32 bitlik uygulamalar için 16-bit ortak iletişim için thunks ve kanca işlevi, yalnızca OPENFILENAME yapısının bir kopyasını alır.

Windows NT/2000: Uygulama dosyasını aç ortak iletişim kutusu Unicode sürümünü kullanmanız gerekir. Örneğin, OPENFILENAMEW yapısını ve GetOpenFileNameW API çağrısı. Bu geçici çözüm, ortak iletişim kutusu açık dosya ANSI sürüm için çalışmaz.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Win32 Uygulama Programlama Arabirimi, Ne zaman ne ile kullanilir:
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
Anahtar Kelimeler: 
kbmt kbcmndlgfileo kbhowto KB131462 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:131462  (http://support.microsoft.com/kb/131462/en-us/ )