Из своей программки вызываю сабж. Работает, кроме как под дебаггером - вылетает с ACCES VIOLATION вот таким образом: +-[_]-CPU 80486 Thread #-328977------------------------ ¦:BFF6117EF2AE repnz scasb ¦:BFF61180 83C8FE or eax,FFFFFFFE ¦:BFF61183 2BC1 sub eax,ecx ¦:BFF61185 5F pop edi ¦:BFF61186 59 pop ecx ¦:BFF61187 C9 leave ¦:BFF61188 C20400 ret 0004 ¦:BFF6118B 55 push ebp ¦:+-[_]------------------------------------------------ ¦:¦ ¦:¦ Exception: Access violation, Read address=ffffffff ¦:¦ Причем этот код не мой, видимо что-то внутри comdlg - вылет происходит сразу после вызова сабжевой функции. А без дебаггера - вроде работает, но как-то подтормаживает. Что-то из полей проиницализировать забыл??? Вот кусочек кода: ImportKff proc local ofn: OPENFILENAME mov ofn.lStructSize,SIZEOF ofn mov eax,[hDlg1] mov ofn.hwndOwner,eax mov eax,h_Inst mov ofn.hInstance,eax mov ofn.lpstrFilter,offset kffFilter mov ofn.lpstrFile, offset kffFileName mov ofn.nMaxFile, 512 mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY mov ofn.lpstrTitle, offset importtitle mov ofn.nFilterIndex,0 mov ofn.lpstrFileTitle,0 invoke GetOpenFileName, ADDR ofn test eax,eax je NoFileSelected
dolbobiven Приведи переменные тоже, может с ними что ни так. Вот какая инициация приводится в MSDN: Код (Text): OPENFILENAME ofn; // common dialog box structure char szFile[260]; // buffer for file name HWND hwnd; // owner window // Initialize OPENFILENAME ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.lpstrFile = szFile; // // Set lpstrFile[0] to '\0' so that GetOpenFileName does not // use the contents of szFile to initialize itself. // ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
попробуй обнулить локальную переменную ofn перед заполнением: lea edi,[ofn] mov ecx,sizeof.OPENFILENAME xor al,al rep stosb
тоже самое на фасме, всё работает как надо Код (Text): proc _openfile, lpWnd,lpTargetPath,lpSize local ofn:OPENFILENAME push ebx esi edi lea edi,[ofn] xor al,al mov ecx,sizeof.OPENFILENAME rep stosb mov edi,[lpTargetPath] or edi,edi jz @F mov ecx,[lpSize] or ecx,ecx jz @F rep stosb lea edi,[ofn] mov [edi+OPENFILENAME.lStructSize],sizeof.OPENFILENAME m2m [edi+OPENFILENAME.hwndOwner],[lpWnd] mov [edi+OPENFILENAME.lpstrFilter],szFilter mov [edi+OPENFILENAME.nFilterIndex],1 m2m [edi+OPENFILENAME.lpstrFile],[lpTargetPath] m2m [edi+OPENFILENAME.nMaxFile],[lpSize] mov [edi+OPENFILENAME.lpstrTitle],szFileTitle mov [edi+OPENFILENAME.Flags],OFN_EXPLORER+OFN_FILEMUSTEXIST+OFN_HIDER EADONLY invoke GetOpenFileName,edi @@: pop edi esi ebx ret endp
Всем привет, снова нужна ваша помощь функция GetOpenFileName меняет рабочий каталог моей программы можно заставить её это не делать, или как узнать рабочий каталог программы, чтобы потом его снова восстановить (и как восстановить)