Передача струн от VBA к C ++ DLLC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Передача струн от VBA к C ++ DLL

Сообщение Anonymous »

Я действительно смущен переходом строк из VBA в C ++. Вот код VBA: < /p>

Private Declare Sub passBSTRVal Lib "foo.dll" (ByVal s As String)
Private Declare Sub passBSTRRef Lib "foo.dll" (ByRef s As String)
Private Declare Sub passByNarrowVal Lib "foo.dll" (ByVal s As String)
Private Declare Sub passByNarrowRef Lib "foo.dll" (ByRef s As String)
Private Declare Sub passByWideVal Lib "foo.dll" (ByVal s As String)
Private Declare Sub passByWideRef Lib "foo.dll" (ByRef s As String)

Sub foobar()
Dim s As String, str As String
str = "Hello There, World!"

s = str
Call passByBSTRVal(s)
s = str
Call passByBSTRRef(s)
s = str
Call passByNarrowVal(s)
s = str
Call passByNarrowRef(s)
s = str
Call passByWideVal(s)
s = str
Call passByWideRef(s)
End Sub
< /code>

и код DLL C ++: < /p>

void __stdcall passByBSTRVal( BSTR s )
{
MessageBox(NULL, s, L"Pass BSTR by value", MB_OK | MB_ICONINFORMATION);
}

void __stdcall passByBSTRRef( BSTR *s )
{
MessageBox(NULL, *s, L"Pass BSTR by ref", MB_OK | MB_ICONINFORMATION);
}

void __stdcall passByNarrowVal( LPCSTR s )
{
USES_CONVERSION;
MessageBox(NULL, A2W(s), L"Pass by Narrow Val", MB_OK | MB_ICONINFORMATION);
}

void __stdcall passByNarrowRef( LPCSTR* s )
{
USES_CONVERSION;
MessageBox(NULL, A2W(*s), L"Pass by Narrow Ref", MB_OK | MB_ICONINFORMATION);
}

void __stdcall passByWideVal( LPCWSTR s )
{
MessageBox(NULL, s, L"Pass by Wide Val", MB_OK | MB_ICONINFORMATION);
}

void __stdcall passByWideRef( LPCWSTR* s )
{
MessageBox(NULL, *s, L"Pass by Wide Ref", MB_OK | MB_ICONINFORMATION);
}
< /code>

Мое ожидание состояло в том, что первые два вызова Passbybstrval и Passbybstrref будут работать. Почему? Потому что строки VBA являются объектами Com BSTR. Однако, проходя через код C ++, значением S для обеих этих функций было мусором (куча кандзи). Кроме того, отображаемое окно сообщений было (то же самое). Я действительно удивлен, что первые две функции не сработали. Однако, вопреки моим ожиданиям, эти две функции действительно работали. Когда я прошел через код C ++, параметр S был именно тем, что я ожидал. Мое ожидание снова было неправильно. Но, как и в случае с делом № 1 (я думаю, эти два случая идентичны), мое ожидание было неправильно. Параметр S состоял из символов мусора (а Messagebox отображал те же символы мусора.) < /P>

Почему моя интуиция была совершенно неверна? Кто -нибудь может объяснить, что я здесь не понимаю?


Подробнее здесь: https://stackoverflow.com/questions/394 ... a-to-c-dll
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»