Я действительно смущен переходом строк из 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