GSerg писал(а):Да нет такого DC...
Знаю, но надо было как-то лаконично объяснить, потому я так "неаккуратно" выразился.
GSerg писал(а):DC - это структура, в которой описаны возможности устройства, а также графические инструменты, в него выбранные.
И что с того?

Что "структура" это не данные? Строке какая разница чё в неё будут пихать?
GSerg писал(а):На винт оно вообще никогда не сохраняется. Есть функции для работы с DC и всё. Не вижу ни одной причины быть недовольным этими функциями.
Не, ты не понял. Возможно, я невнятно выразился. Разумеется, часть данных из DC сидит на винте (иначе, в чём суть виртуальной памяти?). Короче, плевать на весь DC нужно скопировать байты данных ("картинка") в строку (желательно уметь делать обратное), но чтобы обмен между "картинкой" и строкой был как можно быстрее... безо всяких лишних посредников. По идее видимо пойду через GetDIBits (или GetBitmapBits?) и далее буду копировать данные из структуры BITMAPINFO прямо в строку. Если в этой моей идее что-то не так, то поясни.
GSerg писал(а):А что значит "скопировать байты в строку"? Смысл в этом-то какой? Что получить требуется?
Подробно долго объяснять.

Попробую вкратце, пояснить суть проблемы. Мне необходимо, как-то избежать преобразования StrConv(Str,vbFromUnicode)<->StrConv(Str,vbUnicode). Понятное дело, что обычная строка на каждый символ отводит по два байта. Причём адрес младшего байта каждого
i-того символа StrPtr(Str)+(i-1)*2. Функция StrConv жутко медленная и при многократном повторении она пожирает массу времени. Мне было бы удобнее записывать данные числовых байтов в младшие байты строки (по идее это куда быстрее (примерно раза в 4)). Однако, эта сволочь (CopyMem) после операции, скажем,
- Код: Выделить всё
Dim lStr as String, lV as Byte
lStr=" "
lV=255
CopyMem StrPtr(lStr),VarPtr(lV), 1
В младший байт записывает вовсе не 255, а 121...
Приходится делать так:
- Код: Выделить всё
Dim lStr as String, lTS as string, lV as Byte
lStr=" "
lTS=StrConv(lStr,vbFromUnicode)
lV=255
CopyMem StrPtr(lTS),VarPtr(lV), 1
lStr=StrConv(lTS, vbUnicode)
Что неимоверно долго.
GSerg писал(а):И если уже есть массив байт, то это может и неудобно, но он же assignment-compatible со строкой-то.
Правда? А если попробовать нижеследующий код:
- Код: Выделить всё
Dim lS As String, lB() As Byte, lBv As Variant, lV As Long
lV = 255
lS = "Test"
lB = lS
For Each lBv In lB
Debug.Print lBv
Next lBv
lS = lB
MsgBox lS
lB(LBound(lB)) = 255
lS = lB
MsgBox lS
For Each lBv In lB
Debug.Print lBv
Next lBv
Первая буква должна стать "я"(255), а становится "у"(121), и это при том, что в первом lB(LBound(lB)) по прежнему содержится 255. То есть почему-то он часть слова воспринимает, как анси... Как бороться с этой хренью без StrConv'а я не знаю... Об том и вопшаю.
С уважением, Approximator.