|
|
От: |
Vi2
|
http://www.adem.ru |
| Дата: | 23.04.03 06:36 | ||
| Оценка: | |||
На самом деле ты проверил не хранение, а способы передачи строки в подпрограммы. Да, есть 2 способа. Но как хранит строки сам VB — это загадка. Скорее всего в Варианте с VT_BSTR, VT_LPSTR или VT_LPWSTR.M>Самое главное, о чём я до этого не подозревал это то, что VB фактически хранит 2 (!) строки в разных местах:
M>1 — Однобайтовая (ANSI) строка. Для передачи в API типа FuncA
M>2 — Двухбайтовая (Unicode) строка для себя или для API ф-ий типа FuncW.
M>Проверить можно кодом ниже. Это ж какая расточительность, блин – на каждый символ 3 байта.
Private Declare Sub TestVarAnsi Lib "moddll" Alias "_TestVarAnsi@4" (ByVal pDoc As String)
Private Declare Sub TestVarUni Lib "moddll" Alias "_TestVarUni@4" (ByVal pDoc As Any)
Private Sub Form_Load()
Dim s As String
s = "abc"
Call TestVarAnsi(s)
Call TestVarUni(StrPtr(s))
Unload Me
End Sub__declspec(dllexport) void __stdcall TestVarAnsi(/*[in,out]*/ LPSTR pStatus )
{
pStatus[1] = 'A';
return;
}
__declspec(dllexport) void __stdcall TestVarUni(/*[in,out]*/ LPWSTR pStatus)
{
pStatus[1] = 'B';
return;
}