Страница: 1 |
Страница: 1 |
Вопрос: Строки и C
Добавлено: 21.03.06 12:43
Автор вопроса: LamerOnLine | ICQ: 334781088
Тема: есть C++ dll и приложение на VB.
Из VB передается строка. dll - ActiveX.
При Native dll при передаче ByVal передается LPSTR, при ByRef - BSTR*. В случае с ActiveX есть некоторые непонятки. В частности, надо при передаче строки как LPSTR определить - UNICODE она или ANSI, ибо передать в далее вызываемую функцию нужно (char*). SizeOf не канает.
Подскажите, а то седня вообще голова отключилась :)
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #1
Добавлено: 21.03.06 12:57
Если dll - ActiveX, значит у неё внутри tlb.
Если у неё внутри tlb, в tlb параметр описан как char*, или как wchar_t, или ещё как, а может ещё и атрибут [string] повешен, а может и нет.
Но в любом случае VB будет читать tlb и замаршалит строку именно так, как написано в tlb. Хоть в ANSI, хоть в юникоде.
Посему - зырить описание метода на C. VB пришлёт именно то, что написано там в заголовке.
Номер ответа: 2
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #2
Добавлено: 21.03.06 13:01
Это не определяется.
Номер ответа: 3
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #3
Добавлено: 21.03.06 13:05
В idl метод описан как
[id(20), helpstring("method KeyPut"] HRESULT KeyPut(SAFEARRAY (byte) *KeyBuffer, LPSTR KeyName, [out,retval] VARIANT_BOOL *Result);
VB то все нормально присылает, но вот как эта "норма" зависит от разрядности системы и локалей.
Нужно ли юзать MultiByteToWideChar...
Номер ответа: 4
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #4
Добавлено: 21.03.06 14:11
Ы...
Нет конечно.
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 21.03.06 14:25
То бишь палюбому будет ANSI? Я в этой теме частенько путаюсь.
Номер ответа: 6
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #6
Добавлено: 21.03.06 14:50
ANSI будет палюбому, потому что LPSTR.
Напишешь LPWSTR - будет палюбому юникод.
Номер ответа: 7
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #7
Добавлено: 21.03.06 14:56
Ну, про LPWSTR это понятно. Просто, откровенно говоря, нет уверенности что LPSTR будет byte'сами. Можно, конечно, вставить проверку на sizeof(char), как мелкософты рекомендуют, но гемор...
Хотя я, видимо, просто перепил кофе
Номер ответа: 8
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #8
Добавлено: 21.03.06 15:51
Перепил
Эта проверка имеет смысл на стадии компиляции
Номер ответа: 9
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #9
Добавлено: 21.03.06 15:56
ЗЫ Вопрос в догонку - можно ли как LPSTR возвращать retval? Или в данном случае VB конвертацию не производит и требуется BSTR?
Номер ответа: 10
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #10
Добавлено: 21.03.06 16:53
Мммм.... я так не делал, и edanmo в olelib тоже пишет BSTR*, так что проверь лучше.
Номер ответа: 11
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #11
Добавлено: 21.03.06 21:43
Ууу. А кто может сделать статью: Перевод с C на VB?
Номер ответа: 12
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #12
Добавлено: 21.03.06 22:18
Смысл? Вот обратное намного интереснее
Номер ответа: 13
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #13
Добавлено: 22.03.06 11:46
Тут вообще то не про перевод с C на VB, а про их взаимодействие.