|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
FaxDocument.ConnectedSubmit method (аналогично .ConnectedSubmit2 ) В VB.Net это будет Код: vbnet 1.
Return value Type: Variant* Variant that holds an array of outbound job ID strings , one for each recipient of the fax. Тип там VARIANT VT_ARRAY|VT_BSTR (8192|8 ==8200) Начало кода я легко накатал, т.к. недавно успешно повоевал с VT_ARRAY|VT_UI1 Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Т.е. имеем vJobID.vt = VARIANT VT_ARRAY|VT_BSTR (8192|8 ==8200) -проверил, все ОК vJobID.parray As IntPtr -получил, это указатель на искомый VT_ARRAY, состоящий из VT_BSTR Как из него массив String() выковырять? (Marshal.PtrToStringBSTR видимо при делах, но ясно что не так как я на дурака попытался) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2019, 17:19 |
|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2019, 17:53 |
|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
Вроде расковырял методом научного тыка, все работает. Сделал ф-цию Object -> String(). Мучают смутные сомнения насчет того надо или не надо делать VariantClear(tV) Marshal.FreeBSTR(pArray(i)) ??? Интуиция почему-то подсказывает что таки в данном конкретном случае не надо (лучшее враг хорошего) Хотя черт его знает. SafeArrayAccessData/SafeArrayUnaccessData я делаю Marshal.FreeCoTaskMem(vArray) тоже делаю, есть соображения что все остальные проблемы, это проблемы oArray As Object (который отдает мне COM) Не пложу ли я новой неочищенной памяти через Marshal.GetNativeVariantForObject,Marshal.Copy, Marshal.PtrToStringBSTR…? Если какая-то "утечка" явно бросается в глаза, просьба указать. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2019, 05:34 |
|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
Дмитрий77, Нижняя граница safearray может быть не ноль Размер варианта в x64 не 16, а 24 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2019, 08:23 |
|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
ИзопропилНижняя граница safearray может быть не ноль Я обратил внимание на SafeArrayGetLBound, там еще SafeArrayGetDim в общем случае по хорошему. Но в маразм наверно не стоит входить до такой степени. 100% уверен, что в интересуемых меня ConnectedSubmit2/ConnectedSubmit всегда LBound==0 GetDim==0 (ну либо метод вернул False, тогда там понятно ничего нет, хотя на всяк. случай проверяю что LBound>=0) Оставлю как есть, не вижу смысла умничать. ИзопропилРазмер варианта в x64 не 16, а 24 Сначала было кинулся исправлять, но почитал еще раз: VARIANT и SafeArray , посмотрел на этот UNION и на свою Structure tagVARIANTparray. У меня по-любому частный случай: 8 байт + указатель на SafeArray. Т.е. на x64 ==16, а на x86 -вообще ==12 (т.е. перебор, но больше не меньше). (опять же, я же знаю какой именно Variant VT_ARRAY|VT_BSTR там сидит). Поэтому опять же, не вижу смысла чего-то менять. Ты лучше скажи, пямять я в этом коде, на твой взгляд, нигде не теряю? Потому как кухня вся эта очень мутная. Вообще конечно интересные хрени получаются. FaxComEx (как и любой COM) ориентирован типа на школьника, чтоб ему легко все написать без танцев с "API" (изначально ясен пень ориентировано на VB6, хотя в VB.Net суть та же), но когда какой нибудь Security Descriptor или все-го то набор JobID возвращается как "As Object", такие пляски недетские нужны с теми же самыми C-API. Мне б конечно ближе сразу делать через классические C-API, они как бы это выразиться "четче работают и обработка ошибок яснее" но те которые "для Win 2000" (соответствуют FaxCom без Ex)… То что там MS рекомендует и пишет Depricated, это по… (они уже сами запутались со своим "Modern GUI") НО к сожалению эти "C-API для Win 2000" тупо не покрывают тот часто нужный функционал, кот. появился в XP/2003, а некоторый только в Висте. (как пример в C-структуре для Cover Page тупо отсутствует поле для Sender Email - видимо email в середине-конце 90-х был чем-то неактуальным и бесполезным) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2019, 17:56 |
|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
Дмитрий77GetDim==0 GetDim==1 одномерный массив имелось ввиду ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2019, 18:01 |
|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
Код, что я привел двумя постами выше Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86.
На Win2003 (32 бит), и на Win10 x64 все OK. Взял один и тот же Exe-шник, Net 2.0+Release+x86. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
Т.е. проблема в том что моя GetStringArrayFromObject должна мне вернуть набор строк вида "201d5109c4b09e5", а она мне выдает вида "144630930370922981"(только на XP!!!) , и я вот думаю, это я вообще "не то прочитал", или почему-то оно прочиталось "не в том формате". То что с комментом EVENT, это то что возвращается из события как "bstrJobId As String" (согласно COM) и оно должно совпадать с тем что я выкопал из Object (первый элемент массива VARIANT VT_ARRAY|VT_BSTR). То что ошибка в COM /Interop, я сомневаюсь (Interop этот когда-то делался специально под .Net 2.0 и чуть ли не на XP под старой студией, специально чтоб обладать нужной универсальностью). Либо я в коде ковыряния Object-а ляп сделал, либо Marshall на XP глючит. На XP свет клином не сошелся, но неприятно и пока не понимаю почему такой "эффект". ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2019, 04:12 |
|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
А самое интересное, что моя GetStringArrayFromObject (), таки эквивалентна одной строчке кода. Как читать тип варианта в Visual С# 2010 из объекта COM (VB) Код: vbnet 1. 2.
Печально, ступил. Проблема в том, что и с этой "одной строчкой кода" в XP получаем "144630930370922981" вместо "201d5109c4b09e5" "144630930437842551" вместо "201d510a0482677" Мож "конвертануть" как-то? Понять не могу, почему так (ошибки в моей API-ф-ции стало быть нет). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2019, 04:59 |
|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
в XP получаем "144630930370922981" вместо "201d5109c4b09e5" "144630930437842551" вместо "201d510a0482677" Мож "конвертануть" как-то? Получилось Decimal to Hexadecimal Converter Бред какой-то. А че он на XP в Decimal то отдает...? 1) Как проверить что в моей строке сидит Decimal а не Hex? (программно) 2) Как конвертануть Decimal в Hex? (программно) (у меня по любому As String на входе и выходе) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2019, 05:27 |
|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
Дмитрий772) Как конвертануть Decimal в Hex? (программно) Код: vbnet 1.
Обратно вроде так работает, но мне не надо Код: vbnet 1.
Дмитрий771) Как проверить что в моей строке сидит Decimal а не Hex? (программно) ??? Т.е. я де-факто не знаю, вернули ли мне строку как Decimal или как Hex, но она по-любому мне нужна в Hex. Я не уверен, что на XP точно Decimal, а на >=win2003 точно Hex. Я не нашел такой документации, м.б. от чего друго-го зависит. Но странно то что одно и то же так по разному себя ведет. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2019, 07:10 |
|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
Все, разобрался. Почитал вот рассуждения людей JobID, a pointer or just worthless? XP -это fsAPI_VERSION_1 Win2003 -это fsAPI_VERSION_2 (и сюда же кстати XP x64) все что выше Висты - это fsAPI_VERSION_3 fsAPI_VERSION_1 возвращает строку аля-Int64 все что выше возвращает строку в Hex (в нижнем регистре) Все события (включая проблемную fsAPI_VERSION_1) возвращают ID в формате Hex (в нижнем регистре), т.е. отслеживать сравнивать всегда надо в Hex. Плясать правильно от FAX_SERVER_APIVERSION, а не от OS, и для fsAPI_VERSION_1 конвертировать в Hex. Проблема еще в том, что оф. доки путанные, и про Int64/Hex информации нет. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2019, 18:56 |
|
А как ковырять VARIANT VT_ARRAY|VT_BSTR сидящий в As Object?
|
|||
---|---|---|---|
#18+
Неаккуратно записал условие, хотя за счет fsAPI_VERSION_0==0 сработает правильно, но тем не менее это ляпс. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2019, 19:43 |
|
|
start [/forum/topic.php?fid=20&msg=39810806&tid=1398932]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
128ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 287ms |
total: | 516ms |
0 / 0 |