Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Внутри C++ кода есть. Код: plaintext 1. В какой-то момент ей присваивается реальная строка: Код: plaintext 1. Эту строку UserName надо отфутболить через API в VB6 приложение Пытаюсь так например: Код: plaintext 1. 2. 3. 4. 5. Вот как это правильно сделать? Доставать пытаюсь так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. Не получается строку прочитать, пусто! По хорошему на стороне VB конструкция должна быть примерно такая: Код: vbnet 1. 2. 3. 4. 5. 6. 7. Но я не понимаю как зарядить эту конструкцию на стороне C++. C аналогичными ф-циями где надо вернуть несколько чисел (а не строку) я разобрался. Например: C++ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. VB6 Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. С int/Long все работает. Помогите мне char * из C++ вытащить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 02:55 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Все оказалось немного проще: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. К счастью на VB6 я собаку с доставанием строки по Ptr-указателю давно съел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 03:35 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, а просто вернуть BSTR (размещённый через SysAllocString) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 04:40 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Изопропил, Я рад что у меня хоть как то получилось. А чем char * плох? Asprotect в своих API использует именно char *, его я и возвращаю через мою API. А VB6 по любому получит Long - указатель (Ptr) на начало строки. А конец строки - нулевой символ. Проблема возникла из того, что в VB6 нельзя напрямую вызвать нормальные API AsProtect. Вот здесь чуть подробнее: Вопрос по API ф-циям AsProtect если кто сталкивался или умеет использовать "сложные" API. Зато dll-ки с API писать научился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 06:57 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77А чем char * плох? кто память освобождать будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 09:29 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Изопропил, а ты ссылку смотрел постом выше, где более менее полный код приведен? Конструкция Код: plaintext 1. 2. 3. 4. 5. 6. навязана из документации AsProtect. (верхняя "API" не моя и она сработает автоматом, моя (вызываемая по требованию из VB6) только нижняя) А AsProtect фиг знает чего там делает и чего освобождает. Или считаешь, что я должен что-то освобождать со стороны VB, я же только отдаю ссылку на память, а значение там и так лежит с момента как сработает dll (LoadLibrary?) И полагаю что то что там создается при выгрузке dll (проги) очищается. Или предлагаешь коверкать типы? Оно стоит? Я и так C++ коды в час по чайной ложке рожаю. В любом случае UserName запрашивается один раз при старте программы и памяти много не занимает (даже если согласиться что она таки теряется). А почему так уверен что теряется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 09:57 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Внутри C++ кода есть. Код: plaintext 1. Возможно это будет интересно: в разных C++ компиляторах NULL может иметь разное значение, а не 0, как это можно было бы ожидать, что может привести к неожиданному результату для конструкций вида Код: plaintext 1. Поэтому лучше присваивать либо 0, либо nullptr (для C++11). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 11:54 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
CompositumВозможно это будет интересно: в разных C++ компиляторах NULL может иметь разное значение, а не 0, как это можно было бы ожидать, что может привести к неожиданному результату для конструкций вида Код: plaintext 1. Какие могут быть неожиданности, если оператор отрицания для указателей возвращает отрицание сравнения с NULL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 12:00 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77а ты ссылку смотрел постом выше, где более менее полный код приведен? есть прямой путь Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 12:08 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovКакие могут быть неожиданности, если оператор отрицания для указателей возвращает отрицание сравнения с NULL?[/quote] А что тут непонятного? Если символическая константа NULL равна 0, то результат проверки будет 1. В противном случае результат проверки будет 0. Т.о. в зависимости от реализации компилятора результат приведённой мною выше проверки может оказаться различным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 12:09 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
CompositumА что тут непонятного? Если символическая константа NULL равна 0, то результат проверки будет 1. В противном случае результат проверки будет 0. Т.о. в зависимости от реализации компилятора результат приведённой мною выше проверки может оказаться различным.Ещё раз !указатель == !(указатель == NULL) Поэтому (если вдруг), найдётся компилятор, где NULL !== 0 - всё будет работать корректно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 12:13 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovЕщё раз Код: plaintext 1. Поэтому (если вдруг), найдётся компилятор, где NULL !== 0 - всё будет работать корректно. Исходный код: Код: plaintext 1. Если записывать в такой форме: Код: plaintext 1. то несомненно, это всегда будет работать правильно, вне зависимости от реализации компилятора. Но если записать в таком виде: Код: plaintext 1. то возникнет ситуация, о которой я писал выше, поскольку если в реализации конкретного компилятора символическая константа NULL окажется не равной 0, то указанное вами равенство Код: plaintext 1. окажется неверным, т.к. Код: plaintext 1. вернёт 0, в то время как Код: plaintext 1. вернёт 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 12:25 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Compositumвернёт 1.Рассматривайте части моего "равенства" как уравнение и всё встанет на свои места. P.S. А вы можете привести пример компилятора, где NULL !== 0? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 12:28 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovРассматривайте части моего "равенства" как уравнение и всё встанет на свои места. Не вижу, каким образом? Basil A. SidorovP.S. А вы можете привести пример компилятора, где NULL !== 0? Я пользуюсь только MS Visual Studio и GNU g++. А что, обязательно нужно ждать, чтобы споткнуться об это? То, что упоминалось мною выше взято не с потолка, а было вычитано из книжек, где и было дано предупреждение о том, что не стоит слепо полагаться на то, что в C++ всегда NULL == 0, т.к. это не регламентировано в стандарте, но отдано на откуп разработчиков компиляторов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 12:48 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Вспомнил один из сточников, где читал подобного рода информацию: Стивен Прата, "Язык программирования C++ (C++11). Лекции и упражнения", 6-е издание. Глава 12, стр. 610, примечание "Нулевой указатель в C++11". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 13:04 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
CompositumТо, что упоминалось мною выше взято не с потолка, а было вычитано из книжекА в этих книжках не пояснялась семантика оператора "boolean not" применительно к указателям? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 13:05 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovCompositumТо, что упоминалось мною выше взято не с потолка, а было вычитано из книжекА в этих книжках не пояснялась семантика оператора "boolean not" применительно к указателям? Насколько мне известно, оператор "!" превращает 0 в 1, а любое число, отличное от 0 превращает в 0. Поправьте меня, если я не прав. Я что, где-то выше противоречил этому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 13:10 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Compositum, Вы слишком все упрощаете. Оператор ! (а также if() и т.п.) создает булевый контекст для своего аргумента. В булевом контекте, число 0 неявно приводится к false, остальные числа к true. Для указателя другое правило: NULL приводится к false, остальные указатели к true. Таким образом, какое бы не было физическое значение у нулевых указателей, конструкция !ptr всегда работает корректно. Теперь про обратную сторону. Compositum Код: plaintext 1. вернёт 1. Это опять упрощение. Оператор ! не возвращает 0 или 1. Он возвращает bool, т.е. false или true. А в числовом контексте (например при присвоении в int), эти значения неявно переводятся в их соответствующие числовые представления, 0 или 1 (насколько я помню стандартом не определено что true это именно 1, но могу ошибаться, т.к. нет времени искать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 13:27 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyнасколько я помню стандартом не определено что true это именно 1 быстрый гуглинг показал, что при преобразовании из bool в int по стандарту обязательно приводятся к 0 или 1. Но это не отменяет все остальное что я говорил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 13:32 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyДля указателя другое правило: NULL приводится к false, остальные указатели к true. Спасибо, учту на будущее. Я думал, что и указатели приводятся к bool на основе числового значения адреса, на который они указывают. Anatoly Moskovskyнасколько я помню стандартом не определено что true это именно 1, но могу ошибаться, т.к. нет времени искать любое число, отличное от 0 трактуется как true (из книжек). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 13:53 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
CompositumЯ думал, что и указатели приводятся к bool на основе числового значения адресаА ведь вам намекали. Долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 13:55 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovА ведь вам намекали. Долго. Мне лучше писать прямо, без намёков, поскольку надлежащего опыта программирования в C++ у меня нет. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 13:56 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
CompositumAnatoly Moskovskyнасколько я помню стандартом не определено что true это именно 1, но могу ошибаться, т.к. нет времени искать любое число, отличное от 0 трактуется как true (из книжек). CompositumМне лучше писать прямо, без намёков Пишу вам прямо, без намёков - я там в процитированном пишу про перевод из bool в числа. А вы написали про обратное преобразование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2013, 14:04 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
ИзопропилДмитрий77а ты ссылку смотрел постом выше, где более менее полный код приведен? есть прямой путь Код: plaintext 1. 2. 3. 4. 5. Хорошо, давай вообще без самодурства. Есть пример несамодурной API: GetWindowText function Код: plaintext 1. 2. 3. 4. 5. Код для использования GetWindowText из VB6 простой и понятный: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Заметь, без использования моей САМОДУРНОЙ PtrToString на стороне VB6. при помощи которой я вытаскиваю String из памяти зная только Ptr. И я пытаюсь создать свою API по образу и подобию GetWindowText (чтоб возвращала длину и заполняла буфер строчкой). Делаю так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Достаю так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. MsgBox length -честно возвращает число "5" А вот MsgBox RegInfo ни фига не возвращает (буфер как был пуст, так и остался). Что я не так написал в dll что у меня буфер строчкой не заполняется? Как реализовать _Out_ LPTSTR lpString Я в C-шном коде выделил места подвоха. Ток вот как правильно я не знаю. Поможете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2013, 20:55 |
|
||
|
Как мне написать API-ф-цию чтоб возвращала строку.
|
|||
|---|---|---|---|
|
#18+
Дмитрий77И я пытаюсь создать свою API по образу и подобию GetWindowText (чтоб возвращала длину и заполняла буфер строчкой). Делаю так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Что я не так написал в dll что у меня буфер строчкой не заполняется? Как реализовать _Out_ LPTSTR lpString Я в C-шном коде выделил места подвоха. Ток вот как правильно я не знаю. Поможете? Ты не заполняешь буфер, а переопределяешь его. Строки в С это массивы. Их надо копировать специальными функциями, простому знаку равенства они не подвластны. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2013, 21:27 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38315574&tid=2020106]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
76ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 16ms |
| total: | 202ms |

| 0 / 0 |
