Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, уважаемые форумчане! Кажется здесь еще не обсуждалась эта тема - как организовать обмен строковыми данными между офисными VBA-приложениями и простыми (не COM) DLL, написанными на С++. Туда и обратно. Работаю над лингвистическим проектом. Написав программу на VBA под MS Word, которая работает с массивами данных типа String, пришел к выводу, что при увеличении объема данных программа начнет "тормозить". Для ускорения работы некоторых функций решил переписать их на С++ и загнать в DLL. Начал с простых попыток обмена данными, но столкнулся с тем, что строки (слова) в формате BSTR VBA неправильно передаются в DLL. Я не специалист в с++. Начал им заниматься недавно в Vsual Studio 2005. Ниже приведен код функций, которые удачно экспортируются в dll, но дают некорректный результат. Непонятно, в каком виде доходит string до dll? Нужна ваша помощь непрофессионалу. Код: 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. Для VBA: Public Declare Function Zagruzka Lib "C:\Mojadll.dll" () As Long Public Declare Function DaNet Lib "C:\Mojadll.dll" (ByVal ss As String) As Boolean --------------------------------------------------------------------------------------- Sub mydll() Zagruzka Dim Slovo As String Slovo = "пятница" 'если я набираю "ятница" или "ница" - все равно возвращает "True" (почему ???) MsgBox DaNet(Slovo) End Sub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2009, 02:54 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
dgulet, в VB Private Declare Sub ExtracAll Lib "extotms_.dll" (ByVal filename As String) в С++ h модуле обяви например : extern "C" void __declspec(dllexport) __stdcall ExtracAll(char * fileName); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2009, 10:13 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
Попробуйте так. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2009, 11:15 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
~PJ, Пишу строку extern "C" void __declspec(dllexport) __stdcall ExtracAll(char * fileName); в stdafx.h - компилятор выдает 4 ошибки. pszMyNick, Попробовал MessageBox (0, ss.c_str(), "Заголовок", MB_OK); компилятор выдает 1 ошибку - must have class/struct/union ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2009, 17:51 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
dgulet, прошу прощения это я дал для компиляторов C++ Builder . Возможно там небольшое отличие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2009, 21:40 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
Главное, мне бы понять, почему в следующем фрагменте Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. if (ss == WeekdayRu[k]) Т.е. при явном несовпадении строковых значений функция возвращает True. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2009, 03:16 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
потому что бессмысленно сравнивать указатель на char с экземпляром класса std::string. Для сравнения строк стоит использовать функцию strcmp() или её аналоги. Или, как вариант, из входного параметра тоже сконструировать объект типа std::string, и тогда уже сравнивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2009, 10:52 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
egorych, благодарю за указание. Вы правы. Я и прежде пытался сравнивать строки используя оператор strcmp(). Только не получалось. Видимо я невнимательно отнесся к параметрам функции (см. MSDN): int strcmp( const char *string1 const char *string2); Нада было, наоборот, преобразовать std::string * в const char *. Вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Всем СПАСИБО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2009, 16:44 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
ну можно и так написать: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2009, 17:10 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
А как определить количество букв в элементе массива WeekdayRu[k], или длину элемента? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2009, 17:48 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
Джентельмены, а вот такой вопрос - хочу также распознать текст из VBA, передаю его в С++ как ByVal String, принимаю как char. Далее использую switch: case 'B': return 111; break; case 'BA': return 222; break; Если текст начинается с B, то всегда получается 111 :( Как этого избежать, используя switch? PS как видите, я ламер :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2013, 22:35 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
hey ho, case 'BA' должен, как минимум, варнинг при компиляции порождать, вероятно, не зря ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2013, 00:02 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
dgulet Написав программу на VBA под MS Word, которая работает с массивами данных типа String, пришел к выводу, А почему VBA не под Excel? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2013, 09:25 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
egorychhey ho, case 'BA' должен, как минимум, варнинг при компиляции порождать, вероятно, не зря Намекаете на то, что switch работает с однобуквенными вариантами? Я погуглил и не нашёл, ранее сталкивался с тем, что однобуквенные работали, многобуквенные нет. Что где не так делаю? Попробовал то же самое через if else, там тоже не выходит (руки мои оттуда растут, да!). В идеале мне нужно запилить функцию типа x(ABC100500XYZ;N), распарсить её на ABC, 100500 и XYZ и в зависимости от значений этих компонентов, вернуть обратно в VBA результаты типа 100500/N или 100500^N. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2013, 20:59 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
Погуглил ещё, понял что мою проблему через char не решить. Теперь делаю так: VBA Declare PtrSafe Function analysis Lib "blahblah.dll" (ByVal word As String, ByRef N as Double) As Double C++ #include <iostream> #include <string> double __stdcall analysis(std::string & code, double & N) { if (word == "ABC") return 111; else if (code == "BAC") return 222; else return 666; } на этой петрушке всё компилится, но при пересчёте экселя он падает. Кто найдёт шайтана? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2013, 21:52 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
hey hoКто найдёт шайтана? сам ищи :) ByVal word As String в С приедет как LPCSTR строки сравнивать функцией strcmp пример- http://support.microsoft.com/kb/187912/ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2013, 22:19 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
Изопропил, теперь вот как: C++ #include <iostream> #include <string> #include <windows.h> double __stdcall analysis(LPCSTR code, double & N) { if (!strcmp(word, "ABC")) return 111; else if (!strcmp(word, "BAC")) return 222; else return 666; } Компилится, эксель не падает, но выдаёт 666 в любом случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2013, 23:07 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
hey ho, в отладчике смотри что происходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2013, 23:35 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
Изопропилhey ho, в отладчике смотри что происходит Я dll в связке с Excel не знаю как отлаживать :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2013, 00:03 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
hey hoВ идеале мне нужно запилить функцию типа x(ABC100500XYZ;N), распарсить её на ABC, 100500 и XYZ и в зависимости от значений этих компонентов, вернуть обратно в VBA результаты типа 100500/N или 100500^N.в идеале надо в VBA распарсить, и не мучать себе и окружающим мозги ;-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2013, 00:13 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
egorychв идеале надо в VBA распарсить, и не мучать себе и окружающим мозги ;-)) В VBA уже сделано. Сверху парсинга ещё калькуляций прилично, поэтому скорость уже играет роль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2013, 00:26 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
hey hoИзопропилhey ho, в отладчике смотри что происходит Я dll в связке с Excel не знаю как отлаживать :( добавить в солюшн эксель (excel.exe), задать параметры, установить контрольные точки и запустить безобразие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2013, 00:37 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
Изопропилдобавить в солюшн эксель (excel.exe), задать параметры, установить контрольные точки и запустить безобразие Спасибо, буду пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2013, 01:20 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
Что-то не выходит :( Разбираюсь с типами данных, пишут, что LPCSTR и "текст в двойных кавычках" (лулз,ну не знаю я как оно правильно называется) нельзя сравнивать. Как правильно конвертнуть? PS подумав о том как жить дальше, твёрдо решил записаться на курсы С++ :) Кстати, кто чего может в Москве посоветовать? Или может кто уроки даёт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2013, 22:04 |
|
||
|
Обмен данными типа String между VBA и C++ DLL
|
|||
|---|---|---|---|
|
#18+
hey ho, >> Разбираюсь с типами данных, пишут, что LPCSTR и "текст в двойных кавычках" (лулз,ну не знаю я как оно правильно называется) нельзя сравнивать. Как правильно конвертнуть? strcmp() спасёт отца русской демократии >> PS подумав о том как жить дальше, твёрдо решил записаться на курсы С++ :) Кстати, кто чего может в Москве посоветовать? дом книги на новом арбате посети ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2013, 00:36 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38297151&tid=2020138]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 142ms |

| 0 / 0 |
