OleVariant 2 ANSI string

Тема в разделе "WASM.WIN32", создана пользователем dgs, 16 ноя 2009.

  1. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Здрасте, собственно сабж, я конечно представляю что такое OleVariant, но как его в ANSI string перевести не могу понять... Объясните пожалуйста...
     
  2. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Вот делал когда-то. Должно работать.
    Код (Text):
    1. proc Variant2Str,Value,lpsz
    2. pushad
    3. mov   edi,[lpsz]
    4. mov   ecx,[Value]
    5. movzx eax,word[ecx]
    6.  
    7. cmp    al,$0B
    8. jne    notbool
    9. mov    edx,'Да'
    10. mov    eax,'Нет'
    11. test   [ecx+8],al
    12. cmovne eax,edx
    13. mov    [edi],eax
    14. popad
    15. ret
    16. notbool:
    17.  
    18. cmp    al,8
    19. jne    notstring
    20. xor    eax,eax
    21. push   eax
    22. push   eax
    23. invoke WideCharToMultiByte,eax,eax,[ecx+8],-1,edi,65536
    24. popad
    25. ret
    26. notstring:
    27.  
    28. push  ax
    29. fstcw [esp]
    30. or    word[esp],0000011100000000b
    31. fldcw [esp]
    32.  
    33. add   ecx,8
    34. cmp   ax,20
    35. ja    NaN
    36. bt    [NaNSet],eax
    37. jnc   NaN
    38.  
    39. mov   edx,$00C30100
    40. mov   dl,byte[opcodes+eax-2]
    41. mov   bx,$29bf ;fild qword[ecx]
    42. cmp   al,16
    43. cmova dx,bx
    44.  
    45. push  edx
    46. call  esp
    47. pop   edx
    48.  
    49. fld1
    50. fld   st1
    51. fabs
    52. fyl2x
    53. fldl2t
    54. fdivp
    55. fistp dword[esp-4]
    56.  
    57. mov   eax,dword[esp-4]
    58. add   eax,1                     ;если log(X)=-1,
    59. adc   eax,0                     ;то X<1=>
    60. dec   eax                       ;=>кол-во цифр=1 (eax=0)
    61. cmp   al,17
    62. ja    NaN
    63. mov   edx,eax
    64. sub   al,8
    65. cmc
    66. sbb   cl,cl
    67. and   al,cl
    68. fimul dword[power10+eax*4]
    69. fbstp [edi]
    70. fldcw [esp]
    71. pop   cx
    72.  
    73. neg     eax
    74. add     eax,edx
    75. lea     esi,[esp-26+eax+9]
    76.  
    77. push esi
    78. push edi
    79. mov     esi,edi
    80. lea     edi,[esp-18]
    81. mov     ecx,9
    82. unpack2:xor  ax,ax
    83.         lodsb
    84.         shl  ax,4
    85.         shr  al,4
    86.         add  ax,$3030
    87.         stosw
    88. loop unpack2
    89. pop edi
    90. pop esi
    91.  
    92. shl     byte[edi+9],1
    93. mov     byte[edi],'-'
    94. adc     edi,0
    95.  
    96. lea     eax,[esp-25]
    97. mov     ecx,esi
    98. sub     ecx,eax
    99. std
    100. copy:  lodsb
    101.        mov [edi],al
    102.        inc edi
    103.        mov byte[edi],'.'
    104.        sub dl,1
    105.        adc edi,0
    106. loop copy
    107. mov    [edi],cl
    108. scasb
    109. mov    al,'0'
    110. mov    cl,18
    111. repe   scasb
    112. mov    byte[edi+2],ch
    113. cmp    byte[edi+1],47
    114. cmc
    115. sbb    al,al
    116. and    byte[edi+1],al
    117. cld
    118. popad
    119. ret
    120. NaN:
    121. mov    dword[edi],'NaN'
    122. pop    ax
    123. popad
    124. ret
    125. endp
    126.  
    127. power10                 dd   1000000000,\
    128.                              100000000,\
    129.                              10000000,\
    130.                              1000000,\
    131.                              100000,\
    132.                              10000,\
    133.                              1000,\
    134.                              100,\
    135.                              10,\
    136.                              1
    137. opcodes                 db   0dfh,\;fild word[ecx]
    138.                              0dbh,\;fild dword[ecx]
    139.                              0d9h,\;fld  dword[ecx]
    140.                              0ddh  ;fld  qword[ecx]
    141. NaNSet                  dd   229436;1111000000000111100b
     
  3. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Спс, но что то постоянно возвращает NaN ??? Хотя может я и не прав, но

    Код (Text):
    1.         mov     eax, uszBuf
    2.         mov     ebx, [ppw]
    3.         comcall ebx, IWebBrowser2, get_LocationURL, eax
    4.         stdcall Variant2Str, uszBuf, szBuf
    5.         invoke  MessageBox, 0, szBuf, uszBuf, 0
    Может чего не понимаю, объясните пожалуйста....
     
  4. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    http://wasm.ru/article.php?article=ole_variant_to_ansi