• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Неверное чтение строки

Автор MrBarry, 02.11.23, 08:41:15

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Vi2

Смысл всегда есть.
wchar_t * nameFr = TO_OLE("c:\\KompasFiles\\frag1.frw");Это небезопасное использование, по причинам, которые я озвучил ранее.

А вот так безопасно:
WideString nameFr = "c:\\KompasFiles\\frag1.frw";
...
ref = fr->ksFragmentDefinition(TO_OLE(nameFr), TO_OLE("Вставка фрагмента"), 1);
fr->ksReadFragment(TO_OLE(nameFr), 1, par);
Для nameFr TO_OLE вернёт nameFr.c_bstr(), если верить, то это и будет правильный BSTR для nameFr.
Для "Вставка фрагмента" всё то же самое, но временный объект класса WideString будет уничтожен только после выполнения вызова.

Так что для ksFragmentDefinition передадутся правильные BSTR-ы.

MrBarry

Цитата: MrBarry от 03.11.23, 11:33:28Излишне говорить, что не сработало. Аналогично после того, как я протестировал вот это:
WideString(x).c_bstr()...но создавая отдельную переменную WideString, чтоб точно не потерять значение.
Так вот, я же писал, что уже делал это, оно не работает

Я проверил, действительно все неработающие методы принимают на вход строку типа BSTR, а работающие OLESTR. Формулировка проблемы сводится к тому, что API не понимает строки именно типа BSTR

MrBarry

Нарыл при дебаге кое-что интересное
Вот метод ksFragmentDefinition() в файле ks_TLB.h. Переданные мною параметры это значения fileName, comment, insertType, и они, можно слева видеть, получены функцией правильно. Дальше создается TAutoArgs<3> _args, и в него складываются 3 этих параметра. И вот они, как опять можно увидеть слева, сохранились как 1, -1, -1.
Но как я могу повлиять на этот метод, ведь он является частью API, будучи в ks_TLB.h? Это же нелогично

Vi2

Мне неведом класс TAutoArgs и почему он так отображается. Может, отображение не настроено. Возможно, я зря ввязался в эту тему с чужой для меня оболочкой. Или что ты что-то недопоказываешь. Перейди на класс WideString везде, где используешь TO_OLE и передачу wchar_t*. Это будет правильно с точки зрения С++.

По поводу ksFragmentDefinition и её реализации - тут ничего не могу сказать. Я использую МС Студию и директиву #import, чтобы не завязываться на левые или самопальные врапперы. Хотя если его рекомендуют использовать разработчики из Компаса, то это должен быть рабочий вариант, иначе уже бы сообщили им об ошибке.

Вроде в include есть kapi5.h с COleDispatchDriver вместо Ks_TLB.h с TDispWrapper<IDispatch>. Может, он поможет, если его можно использовать в Builder. Возможно в Builder есть и другие способы подключить в проект библиотеку типов - ведь ребята из Компаса как-то создали реализацию, не руками же.  ;)

***
COleDispatchDriver использует просто строки, не требуя именно BSTR.
+ Благодарностей: 1

MrBarry

Подытожу тему: я так и не понял сути проблемы, хоть и локализовал так сильно, как мог. Решения тоже не нашёл в границах языка С++, но как только перешёл на С#, мгновенно и примеры из Step5 заработали (безо всяких поправок с Init() ), и свой код, дословно переведённый с плюсов на решетку заработал, и у файла название уже не -1, а какое должно быть. Правильно мне говорили в какой-то теме, что надо просто сменить язык и всё будет нормально)))

dlsh