Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Исходный код (мой) из которого пытаюсь родить нужную мне dll в соседнем топике: Получение нестандартных полей (телефон,факс) из Windows Contacts -диалог Select Recipients Ну или под спойлером (Юникод вариант я таки осилил): Код: plaintext 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. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. В общем как-то так пока: Код: plaintext 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. Полный пока код функции под спойлером, но суть я в общем выделил выше: Код: plaintext 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. 87. 88. 89. 90. 91. 92. Проблема в чем. Последний аргумент функции LPRECIPLIST FAR * lppRecipList это типа указатель на массив структур RECIPLIST. Размерность массива соответствует числу выбранных в диалоге адресной книги получателей, посему заранее (на вызывающей стороне) не известна. Функция также возвращает число этих самых элементов массива в return cEntries Пока с lppRecipList не стал играться все работало. Тест-Код на стороне VB.Net клиента такой: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Для начала хочу получить указатель на массив, т.е. PtrRecipList. Ошибка вылазит: .NetНеобработанное исключение типа "System.AccessViolationException" в WabTestNet.exe Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. Что я напортачил в C++? Предполагаю, что не выделил память под элементы массива. Внутри C кода мне известна размерность lppAdrList->cEntries И я потом начинаю заполнять элементы lppRecipList[i]->lpszDisplayName = lpProp->Value.lpszW; lppRecipList[i]->lpszEmailAddress = lpProp->Value.lpszW; Или где-то тупо ошибся в "грамматике", делал как бы по образу-подобию чего под руку подвернулось. В .Net предполагаю сначала получить указатель IntPtr на массив структур, потом воспользоваться Marshal.PtrToStructure (Ptr) сдвигая Ptr на размер структуры для получения след. элемента (количество функция возвратит) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 06:49 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, размер нужно тоже возвращать. например, сделать еще один выходной параметр. (в функцию передать указатель на size_t, в функции под этому адресу записать значение) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 10:42 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
MasterZiv, детальнее в эту хрень не волновался, извини... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 10:44 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
MasterZivразмер нужно тоже возвращать.) Так именно его я возвращаю. 0- если элементов нет или к-во элементов если они есть. Но к-во элементов в массиве становится известно только внутри самой ф-ции. MasterZiv (в функцию передать указатель на size_t, в функции под этому адресу записать значение) Ну так я и передаю указатель ByRef LPRECIPLIST FAR * lppRecipList. По идее ф-ция должна в этом параметре вернуть указатель, и по этому указателю записать массив. При этом наверно выделить нужную память перед тем как писать. И вот как это сделать? А освобождать эту память видимо надо уже в вызывающем приложении после прочтения массива. Зарезервировать память по указателю в вызывающем приложении и кинуть в ф-цию конкретный указатель я не могу, т.к. заранее не знаю сколько нужно памяти (к-во элементов в массиве становится известно только внутри самой ф-ции). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 14:52 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Хорошо, давайте по простому, а то слишком много кода привел: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Вызов из клиента Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. ошибка на клиенте при вызове CPP_TestНеобработанное исключение типа "System.AccessViolationException" в WabTestNet.exe Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. Не, ну то что я делаю что-то сильно не так, это я понимаю. А как сделать так? Я хочу сделать по аналогии с MAPIAddress function Последний параметр _Out_ lpMapiRecipDesc *lppNewRecips lppNewRecips outPointer to an array of MapiRecipDesc structures containing the final list of recipients. This array is allocated by MAPIAddress, cannot be NULL, and must be freed using MAPIFreeBuffer, even if there are no new recipients. Чтобы можно было из клиента использовать код типа как здесь сделал: 18646419 (к сожалению у меня нет исходников ф-ции MAPIAddress чтобы посмотреть C-начинку как они этот чертов массив внутри API формируют). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 16:11 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Ну вот так вроде выводит: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Но у меня .Net прога почему-то виснет. Выводит MsgBox(NewReceipts( 0 ).ulReceipType.ToString & " : " & NewReceipts( 0 ).lpszDisplayName.ToString & "<" & NewReceipts( 0 ).lpszEmailAddress.ToString & ">") и виснет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 16:59 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Но у меня .Net прога почему-то виснет. Виснет из за Marshal.FreeCoTaskMem(PtrRecipList) Если убрать, то не виснет. Но тогда вопрос как освободить память захапанную на стороне C через malloc. И дальше, пытаюсь напр. выводить массив из 2-х элементов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Гадина рушится очевидно при попыке заполнения lppRecipList[1] (выделенные строчки) Как правильно память выделить под массив из 2-х или n элементов? (внутри c я размер знаю) Или надо как-то объяснить в коде что это именно массив и что там n элементов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 17:26 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77на стороне C через malloc. ответ в вопросе - выделяй через CoTaskMemAlloc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 18:07 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
ИзопропилДмитрий77на стороне C через malloc. ответ в вопросе - выделяй через CoTaskMemAlloc За это спасибо. Если убрать malloc и сделать в C Код: plaintext 1. то на стороне .Net Код: vbnet 1. не приводит к висяку и надо думать вопрос высвобождения памяти таким образом решается Но что делать если элементов больше одного Вот этот код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. безжалостно глючит Не хочет понимать что lppRecipList это массив из двух элементов и под него выделена память под два элемента. Если убрать заполнение lppRecipList[1] то не глючит. Но я то массив хочу вернуть, а размер задать внутри ф-ции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 18:37 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77безжалостно глючит содержательная диагностика ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 19:01 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, размеры структур сравни в с++ и бейсик коде. выравнивание может быть разным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 19:08 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
ИзопропилДмитрий77безжалостно глючит содержательная диагностика Я писал выше ошибку в .Net. авторНеобработанное исключение типа "System.AccessViolationException" в WabTestNet.exe Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. И происходит она до того как ф-ция чего-то возвращает. Ошибка очевидно в C-коде при заполнении элемента массива отличного от первого, я выделил строчки в коде. Сказать какая с т. зр. C не могу, это dll, компилируется нормально. Я думаю человек пишущий на C сразу поймет, но я то оч. редко к C обращаюсь. Изопропилразмеры структур сравни в с++ и бейсик коде. выравнивание может быть разным 12 и там и там. Две строки и число по 4 байта на элемент структуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2016, 20:52 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Не получается у меня больше одного элемента вернуть. Неужели такая сложная задача Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Ну что тут может быть не так? Все уже перепробовал, как гуглить эти вещи не знаю. Почему не пишет второй элемент lppRecipList[1]? Не, могу наверно все данные в одну строку "распечатать" и вернуть, а потом сидеть как дебил в бейсике парсить километровую строку (результат можно достичь и гавнокодом), но хотелось бы по нормальному. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 00:19 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, попробуй памяти выделить с запасом, в отладчике посмотри что происходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 00:49 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Изопропилпопробуй памяти выделить с запасом, Это не помогает. Так написал: Код: plaintext 1. Куда больше? А вылетает точно также на заполнении второго элемента. Там что-то другое. Просто C ни хрена не знаю, навыка нет, но иногда надо, вот и мучаюсь. Я вот думаю, у меня в структуре строки. Размер 12 байтов, 4 байта на строку. Но 4 байта это указатель на массив байтов, где эта строка сидит. Когда я память выделяю, я ее выделяю под указатель на массив байтов а не под сам этот массив. Где гарантия что там все корректно будет? Не не то, с одним элементом же корректно работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 01:20 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Как мне хотя б массив строк вывести? Пытаюсь так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Достаю так (ну хоть как то): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. В последних трех словах из примера первая буква теряется. Это дурдом какой-то. Как мне через API вывести набор? Имя тип адресата телефон факс количество этих выборок и все данные мне внутри C-кода доступны. Данные я получил. Вывести не могу. Длинные строки (5 строк с разделителями а потом парсить) я вернуть могу конечно, но в си объединение строк через всякие wsprintf это тоже задница буфер придется делать немеренный (а вдруг выборка на 20000 адресатов?) плохой вариант. Мне надо хотяб пять массивов строк, если не один массив структур. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 08:26 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Мне реальным только вариант в таком духе видится: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Он работает, но это через одно место. Причем теоретически буфера в 100000 для строки тоже могут переполниться. Если считать что поле 20 символов, то 100000/20=5000 записей. Смотря какие цели. Если добавить 2 e-mail то это излишки, а если выборка из номеров телефонов, то может и не хватить. И думаю транжирство памяти, хорошо если не утекает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 08:50 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, воспроизвести ошибку никак не удалось, всё возвращается как положено какой фрагмент приведённого кода действующий, а какой мысли вслух - понять не могу лучше всего - приложи целиком проект с++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 12:00 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, внимательно прочитал твои портянки, ошибочка простая. Причина - говнокод в качестве заготовкм в твоём коде - lppRecipList - трактуется не как указатель на массив структур, а массив указателей на структуры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 12:24 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Изопропиллучше всего - приложи целиком проект с++ Лови. CPP_AddressBook -собственно ради чего все делается (вылетает при выборе 2-х и более адресатов) CPP_Test - попытка вернуть 2 элемента структуры (соответственно также вылетает) CPP_Test2- попытка вернуть массив просто строк (не вылетает и даже выводит, но не совсем правильно) Проект VC++2005EE, но конвертация в 2010 не спасает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 13:16 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
На всякий случай сопряженный VB.NET (2013) Пути в декларациях указаны абсолютные, надо менять на свои. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 13:18 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
ИзопропилДмитрий77, внимательно прочитал твои портянки, ошибочка простая. Причина - ... в твоём коде - lppRecipList - трактуется не как указатель на массив структур, а массив указателей на структуры Ты лучше скажи как записать чтоб было правильно. Я на C вообще пишу очень редко и от этих звездочек справа слева честно крыша сразу съезжает. И очень хочется чтоб ты был прав, потому как измотался уж. Со строками, которые соединять а потом парсить - не вариант. Макс. буфера и длины строки хватает на 30 где-то контактов, потом Stack Overflow. Уже думал в файл результат написать, а потом из VB его прочесть. Но это уже ни в какие ворота (в рамках вызова одной ф-ции). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 13:27 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, Код: plaintext 1. 2. PS а насчёт звёздочек - эт ты зря ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 13:48 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, память не забудь аккуратно почистить, лучше всего доверить это с++ коду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 13:56 |
|
||
|
Как вернуть через API массив структур? API эту сам пишу.
|
|||
|---|---|---|---|
|
#18+
ИзопропилДмитрий77, Код: plaintext 1. 2. Заработало, однако. До меня б никогда не доперло. Огромное спасибо. Изопропилпамять не забудь аккуратно почистить, лучше всего доверить это с++ коду С Код: plaintext 1. .Net Код: vbnet 1. Недостаточно? (на стороне C++ наверно не смогу, иначе затрется то что возвращаю) Ну, не считая естественно очистки структур в самих интерфейсах, где это указано в msdn, что действительно делается в си. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 14:14 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39143525&tid=2018644]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
160ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 14ms |
| total: | 288ms |

| 0 / 0 |
