|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 14, 2004 09:57:55 Здравствуйте! Вопрос мой связан с ошибками в Windows 2000 при выполнении программ. Вчера, G3 помог мне в написании алгоритма. Я его получил и захотел выполнить программу, но... под Windows 2000 Professional прога не работает. Посмотрите, пожалуйста, что может такую вызывать ошибку и как её в сорсе исправить, чтобы все рабочие свойства сохранились (алгоритм очень нужен!)? Я вчера целый день просидел над этим вопросом, но даже не понял в чём дело. До сего момента я сталкивался с ошибками в Win2000, например при работе с диалогом, если писать в ebx после GetDlgItemTextA. Кстати, некоторые программы из раздела "Исходники", в которых есть сложные вычисления тоже не работают под Windows 2000. (Например, DriveInfo). В атаче - сорс. Заранее спасибо! 1990 _100345908__divide.rar |
|
|
Дата: Апр 14, 2004 11:14:54 1990 В подпрограмме Divide ты устанавливаешь флажок направления в положение std верни его на место, т.е. сделай cld и будет тебе счастье. |
|
|
Дата: Апр 14, 2004 11:30:14 Я когда-то запустил под Win2000 программку, которая производила определенные вычисления, а потом преобразовывала результаты в строки символов. Под Win98 она работала без проблем, а под Win2000 не захотела. Трассировка показала, что сбой давал вызов строковых функций из kernel32.dll (lstrlen, lstrcat, lstrcpy). Я не понял сам, почему это происходило, но после того, как заменил эти функции своими подпрограммами, все стало работать нормально. Если дело не в флажке направления, попробуй заменить функцию lstrlen своей подпрограммой. |
|
|
Дата: Апр 14, 2004 11:54:16 q_q Спасибо! Сейчас попробую и скажу о результатах. bazed Сенкс!Тоже выход и тоже буду пробовать... |
|
|
Дата: Апр 14, 2004 12:01:00 q_q Огромное спасибо! Все заработало. А почему нужно флаг направления сбрасывать в Windows 2000, а в других сбрасывать не нужно? Может быть есть и ещё какие-нибудь такие хитрости? |
|
|
Дата: Апр 14, 2004 12:13:52 > с ошибками в Windows 2000 при выполнении программ Однако как грамотно сказано, прямо складывается впечатление что это ошибки в винде, а не что кто-то не умеет правильно писать программы под win32 :-) |
|
|
Дата: Апр 14, 2004 12:21:43 · Поправил: q_q 1990 А почему нужно флаг направления сбрасывать ... Если бы я знал точную формулировку, то написал бы ее в предыдущем сообщении. В случае с cld/std знания эмпирические. Может быть есть и ещё какие-нибудь такие хитрости? Почему ты используешь mov edx,1 L10: imul edx,10 loop L10 mul edxа не L10: imul eax,10 loop short L10 xor edx,edx? |
|
|
Дата: Апр 14, 2004 12:28:22 · Поправил: 1990 Dr.Golova Я не имел ввиду, что ошибки в Windows, а просто говорил, что встретился с трудностями. Если ты считаешь, что я не умею хорошо программить - в этом есть правда, но привязываться к словам не нужно. q_q Теперь буду использовать в соотвествии с ситуцией. |
|
|
Дата: Апр 14, 2004 13:25:48 Я как-то привык не использовать mul/imul при умножении на константу. Вот так можно умножить на 10 lea eax, [eax+eax*4] shl eax, 1 быстрее на порядок, и как-то понятней, имхо :) |
|
|
Дата: Апр 14, 2004 13:46:49 · Поправил: Asterix [ bazed: Трассировка показала, что сбой давал вызов строковых функций из kernel32.dll (lstrlen, lstrcat, lstrcpy). Я не понял сам, почему это происходило, но после того, как заменил эти функции своими подпрограммами, все стало работать нормально. Если дело не в флажке направления, попробуй заменить функцию lstrlen своей подпрограммой.] :-) [edited] |
|
|
Дата: Апр 14, 2004 14:32:31 1990 Твоя IntToStr на самом деле UIntToStr masquer Вот так можно умножить на 10 Я не против подобных замен, однако ... Твой код точно соответствует imul'у? И потом если результат умножения займет больше 32-ух разрядов? Asterix что кто-то не умеет пользоваться отладчиком Cколько времени тебе понадобится, чтобы используя отладчик, в недрах USER32.MessageBox определить, что проблема в std. |
|
|
Дата: Апр 14, 2004 15:46:29 [ q_q: Cколько времени тебе понадобится, чтобы используя отладчик, в недрах USER32.MessageBox определить, что проблема в std.] Думаю меньше минуты ;-) |
|
|
Дата: Апр 14, 2004 15:46:50 · Поправил: Asterix Вобщем я считаю что опять "отличились" мелкомягкие, вот: .text:77E375D5 ; int __stdcall MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType) .text:77E375D5 public MessageBoxA .text:77E375D5 MessageBoxA proc near .text:77E375D5 .text:77E375D5 hWnd = dword ptr 8 .text:77E375D5 lpText = dword ptr 0Ch .text:77E375D5 lpCaption = dword ptr 10h .text:77E375D5 uType = dword ptr 14h .text:77E375D5 .text:77E375D5 push ebp .text:77E375D6 mov ebp, esp .text:77E375D8 push ecx .text:77E375D9 cmp dword_77E681DC, 0 .text:77E375E0 jnz loc_77E4842A .text:77E375E6 .text:77E375E6 loc_77E375E6: ; CODE XREF: .text:77E48449j .text:77E375E6 ; .text:77E48457j .text:77E375E6 push 0 ; wLanguageId .text:77E375E8 push [ebp+uType] ; uType .text:77E375EB push [ebp+lpCaption] ; lpCaption .text:77E375EE push [ebp+lpText] ; lpText .text:77E375F1 push [ebp+hWnd] ; hWnd .text:77E375F4 call MessageBoxExA .text:77E375F9 leave .text:77E375FA retn 10h .text:77E375FA MessageBoxA endp .text:77E375FD ; int __stdcall MessageBoxExA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType,WORD wLanguageId) .text:77E375FD public MessageBoxExA .text:77E375FD MessageBoxExA proc near ; CODE XREF: MessageBoxA+1Fp .text:77E375FD .text:77E375FD var_8 = dword ptr -8 .text:77E375FD lpMem = dword ptr -4 .text:77E375FD hWnd = dword ptr 8 .text:77E375FD lpText = dword ptr 0Ch .text:77E375FD lpCaption = dword ptr 10h .text:77E375FD uType = dword ptr 14h .text:77E375FD wLanguageId = word ptr 18h .text:77E375FD .text:77E375FD push ebp .text:77E375FE mov ebp, esp .text:77E37600 push ecx .text:77E37601 push ecx .text:77E37602 push ebx .text:77E37603 push esi .text:77E37604 push edi .text:77E37605 xor edi, edi .text:77E37607 or esi, 0FFFFFFFFh .text:77E3760A cmp [ebp+lpText], edi .text:77E3760D mov [ebp+lpMem], edi .text:77E37610 mov [ebp+var_8], edi .text:77E37613 jz short loc_77E3762E .text:77E37615 push 1 .text:77E37617 lea eax, [ebp+lpMem] .text:77E3761A push esi .text:77E3761B push eax .text:77E3761C push esi .text:77E3761D push [ebp+lpText] .text:77E37620 push edi .text:77E37621 call MBToWCSEx .text:77E37626 test eax, eax .text:77E37628 jz loc_77E4885D .text:77E3762E .text:77E3762E loc_77E3762E: ; CODE XREF: MessageBoxExA+16j .text:77E3762E cmp [ebp+lpCaption], edi .text:77E37631 jz short loc_77E3764C .text:77E37633 push 1 .text:77E37635 lea eax, [ebp+var_8] .text:77E37638 push esi .text:77E37639 push eax .text:77E3763A push esi .text:77E3763B push [ebp+lpCaption] .text:77E3763E push edi .text:77E3763F call MBToWCSEx .text:77E37644 test eax, eax .text:77E37646 jz loc_77E4884D .text:77E3764C .text:77E3764C loc_77E3764C: ; CODE XREF: MessageBoxExA+34j .text:77E3764C cmp dword_77E681DC, edi .text:77E37652 jnz loc_77E48864 .text:77E37658 .text:77E37658 loc_77E37658: ; CODE XREF: .text:77E48883j .text:77E37658 ; .text:77E48891j .text:77E37658 push dword ptr [ebp+wLanguageId] ; wLanguageId .text:77E3765B push [ebp+uType] ; uType .text:77E3765E push [ebp+var_8] ; lpCaption .text:77E37661 push [ebp+lpMem] ; lpText .text:77E37664 push [ebp+hWnd] ; hWnd .text:77E37667 call MessageBoxExW .text:77E3766C push [ebp+lpMem] ; lpMem .text:77E3766F mov esi, ds:HeapFree .text:77E37675 mov ebx, eax .text:77E37677 push edi ; dwFlags .text:77E37678 push hHeap ; hHeap .text:77E3767E call esi ; HeapFree .text:77E37680 cmp [ebp+var_8], edi .text:77E37683 jz short loc_77E37691 .text:77E37685 push [ebp+var_8] ; lpMem .text:77E37688 push edi ; dwFlags .text:77E37689 push hHeap ; hHeap .text:77E3768F call esi ; HeapFree .text:77E37691 .text:77E37691 loc_77E37691: ; CODE XREF: MessageBoxExA+86j .text:77E37691 mov eax, ebx .text:77E37693 .text:77E37693 loc_77E37693: ; CODE XREF: .text:77E4885Fj .text:77E37693 pop edi .text:77E37694 pop esi .text:77E37695 pop ebx .text:77E37696 leave .text:77E37697 retn 14h .text:77E37697 MessageBoxExA endp .text:77E13E10 MBToWCSEx proc near ; CODE XREF: LoadCursorA+2Bp .text:77E13E10 ; wvsprintfW+275p ... .text:77E13E10 .text:77E13E10 arg_0 = word ptr 8 .text:77E13E10 arg_4 = dword ptr 0Ch .text:77E13E10 arg_8 = dword ptr 10h .text:77E13E10 arg_C = dword ptr 14h .text:77E13E10 arg_10 = dword ptr 18h .text:77E13E10 arg_14 = dword ptr 1Ch .text:77E13E10 .text:77E13E10 push ebp .text:77E13E11 mov ebp, esp .text:77E13E13 push ebx .text:77E13E14 mov ebx, [ebp+arg_8] .text:77E13E17 push esi .text:77E13E18 push edi .text:77E13E19 test ebx, ebx .text:77E13E1B jz loc_77E13EC7 .text:77E13E21 mov edx, [ebp+arg_10] .text:77E13E24 test edx, edx .text:77E13E26 jz loc_77E13EC7 .text:77E13E2C mov edi, [ebp+arg_4] .text:77E13E2F test edi, edi .text:77E13E31 jz loc_77E13EC7 .text:77E13E37 test ebx, ebx .text:77E13E39 jge short loc_77E13E56 .text:77E13E3B cmp ebx, 0FFFFFFFEh .text:77E13E3E jl loc_77E13EC7 .text:77E13E44 or ecx, 0FFFFFFFFh .text:77E13E47 xor eax, eax .text:77E13E49 repne scasb ; <--- проблема наверняка возникает здесь .text:77E13E4B not ecx .text:77E13E4D dec ecx .text:77E13E4E lea ebx, [ebx+ecx+2] .text:77E13E52 test ebx, ebx .text:77E13E54 jz short loc_77E13EC7 .text:77E13E56 .text:77E13E56 loc_77E13E56: ; CODE XREF: MBToWCSEx+29j .text:77E13E56 mov edi, [ebp+arg_14] .text:77E13E59 cmp edx, 0FFFFFFFFh .text:77E13E5C jnz short loc_77E13EC0 .text:77E13E5E test edi, edi .text:77E13E60 jz short loc_77E13EC7 .text:77E13E62 mov [ebp+arg_10], ebx .text:77E13E65 mov edx, ebx .text:77E13E67 .text:77E13E67 loc_77E13E67: ; CODE XREF: MBToWCSEx+B5j .text:77E13E67 mov esi, [ebp+arg_C] .text:77E13E6A test edi, edi .text:77E13E6C jz short loc_77E13E80 .text:77E13E6E lea eax, [edx+edx] .text:77E13E71 push eax .text:77E13E72 call sub_77E1757E .text:77E13E77 test eax, eax .text:77E13E79 mov [esi], eax .text:77E13E7B jz short loc_77E13EC7 .text:77E13E7D mov edx, [ebp+arg_10] .text:77E13E80 .text:77E13E80 loc_77E13E80: ; CODE XREF: MBToWCSEx+5Cj .text:77E13E80 mov ecx, ds:NlsAnsiCodePage .text:77E13E86 mov ax, [ebp+arg_0] .text:77E13E8A cmp ax, [ecx] .text:77E13E8D jz short loc_77E13E98 .text:77E13E8F test ax, ax .text:77E13E92 jnz loc_77E40993 .text:77E13E98 .text:77E13E98 loc_77E13E98: ; CODE XREF: MBToWCSEx+7Dj .text:77E13E98 push ebx .text:77E13E99 lea eax, [ebp+arg_8] .text:77E13E9C push [ebp+arg_4] .text:77E13E9F push eax .text:77E13EA0 lea eax, [edx+edx] .text:77E13EA3 push eax .text:77E13EA4 push dword ptr [esi] .text:77E13EA6 call ds:RtlMultiByteToUnicodeN .text:77E13EAC test eax, eax .text:77E13EAE jl loc_77E409BE .text:77E13EB4 mov eax, [ebp+arg_8] .text:77E13EB7 shr eax, 1 .text:77E13EB9 .text:77E13EB9 loc_77E13EB9: ; CODE XREF: MBToWCSEx+B9j .text:77E13EB9 ; .text:77E409B9j .text:77E13EB9 pop edi .text:77E13EBA pop esi .text:77E13EBB pop ebx .text:77E13EBC pop ebp .text:77E13EBD retn 18h .text:77E13EC0 ; ---------------------------------------------------------------------- ----- .text:77E13EC0 .text:77E13EC0 loc_77E13EC0: ; CODE XREF: MBToWCSEx+4Cj .text:77E13EC0 cmp edx, 0FFFFFFFFh .text:77E13EC3 jl short loc_77E13EC7 .text:77E13EC5 jmp short loc_77E13E67 .text:77E13EC7 ; ---------------------------------------------------------------------- ----- .text:77E13EC7 .text:77E13EC7 loc_77E13EC7: ; CODE XREF: MBToWCSEx+Bj .text:77E13EC7 ; MBToWCSEx+16j ... .text:77E13EC7 xor eax, eax .text:77E13EC9 jmp short loc_77E13EB9 .text:77E13EC9 MBToWCSEx endp |
|
|
Дата: Апр 14, 2004 16:03:22 · Поправил: 1990 Asterix В смылсе "отличились"? А почему решил поправил? ;) |
|
|
Дата: Апр 14, 2004 16:19:03 Твой код точно соответствует imul'у? И потом если результат умножения займет больше 32-ух разрядов? Нет, конечно, для знакового умножения и больших чисел такое не подойдет. Кстати в данном примере можно избежать этого цикла вообще - lookup табличку степеней построить - всяко быстрее будет |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.049 |