Страница: 1 |
Страница: 1 |
Вопрос: не работает API функция CopyMemory
Добавлено: 16.12.05 16:00
Автор вопроса:
sia1
Всем доброго время суток!!!
уже какой день бьюсь с проблемой...и никак не могу понять что к чему. Из макроса вызывается функция CopyMemory которая всегда возвращает 0. Для примера покажу текст:
CopyMemory Ret, bytArr(4), 2
под отлатчиком переменная показывает значение bytArr(4)=118, следовательно, я ожидал результат 11, но он мне упорно возвращает 0. Дабы быть человеком грамотным я облазил все форумы, посмотрел кучу примеров, которые якобы должны работать, но у меня результат один и тот же... Где-то даже было написано, что в макросах нельзя использовать API функции, странно конечно но я раньше пользовался и все работало нормально, что сейчас происходит просто не понимаю :((( Если кто сталкивался с проблемой подскажите...
OS:2000 SP4
Office: 2003 SP2
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа: mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #1
Добавлено: 16.12.05 16:09
Объявление CopyMemory покажи, может там что не так??? Истинное имя функции же не CopyMemory, а RtlMoveMemory:
ByRef Destination As Any, _
ByRef Source As Any, _
ByVal Length As Long)
Номер ответа: 2
Автор ответа: GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #2
Добавлено: 16.12.05 16:31
Во-первых, хочу знать смысл кода CopyMemory Ret, bytArr(4), 2 и его отличие от Ret = bytArr(4).
Во-вторых, откуда ты ожидал результат 11 и откуда 0?
Номер ответа: 3
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 17.12.05 02:21
Наверно Ret - это integer, а bytArr - это массив байт и Ret = bytArr(4) скопирует только 1 байт, в то время как надо 2.
Функция CopyMemory, согласно MSDN, вообще не имеет возвращаемого значения.
Номер ответа: 4
Автор ответа: HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #4
Добавлено: 17.12.05 06:50
sia1
Похоже, ты не знаешь, какая разница между Byte и Integer, как представлены числа в памяти и что делает CopyMemory
Для того чтобы из 118 получить 11, CopyMemory не нужна.
Достаточно сделать Ret = bytArr(4)\10
Номер ответа: 5
Автор ответа: sia1
Вопросов: 12
Ответов: 18
Профиль | | #5
Добавлено: 19.12.05 15:17
Спасибо что указали мне на ошибки....
Я посмотрел как сделал CyRax в своем классе BPDBF.
Я решил его поюзать, вот только у меня с кодировкой беда. Сам dbf в dos кодировке начинаю доставать данные функцией GetColumn, она возвращает иероглифы.
Параметр UseOEM ничего не дает…
что за фигня такая.
Номер ответа: 6
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 19.12.05 16:38
Слушай, а что класс работает у тебя в ВБА? А вообще то его под ВБ6 писал.
Номер ответа: 7
Автор ответа: sia1
Вопросов: 12
Ответов: 18
Профиль | | #7
Добавлено: 19.12.05 17:09
Да отлично работает, вот только проблема с кодировкой...
Я посмотрел под отлатчиком все происходит вот этой строке...
GetColumn = StrConv(ByteArr, vbUnicode)
в переменной ByteArr побайтно лежат коды dos кодировки я проверил всё честно, а вот сама функция возращает уже строку с иероглифами...
Номер ответа: 8
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 19.12.05 17:19
Вот это условие должно сработать
ReDim Preserve ByteArr(HeaderColumns(ColNumber).FieldLen)
ByteArr(UBound(ByteArr)) = 0
OemToChar ByteArr(0), ByteArr(0)
GetColumn = StrConv(ByteArr, vbUnicode)
Exit Function
End If
Т.е. ByteArr уже должен содержать нормальные виндовые коды, полученные предварительно АПИ функцией OemToChar. Вобщем в ВБ6 у меня работает, а в ВБА я не пробовал. Посмотри в документации использование StrConv, может флаги какие там дополнительно должны быть. А вообще, назначение этой функции - перевод байтового массива в ВБ-шную ОЛЕ-строку.
Номер ответа: 9
Автор ответа: sia1
Вопросов: 12
Ответов: 18
Профиль | | #9
Добавлено: 19.12.05 17:41
нет...я вызываю твою функцию с параметром UseOEM = False.
Я пробовал оба варианта вызыва.
UseOEM = True
UseOEM = False
результат один и тотже....
Моожно ради эксперимента я тебе файлик вышлю, а ты посмотришь своёй прогой?
Файл 100% дос кодировке, я смотрю утилитой DBFNavigator,
который в дос. кодировке показывает все нормально а в win показывает то что твоя функция выдаёт один в один.
Номер ответа: 10
Автор ответа: sia1
Вопросов: 12
Ответов: 18
Профиль | | #10
Добавлено: 19.12.05 18:02
Что-то я совсем запутался ...
может я все не правильно понимаю....Давай на пальцах объясню. Грубо говоря у меня данные в файле в dos кодировке, пример:
ВОЗВРАТ -> dos (если смотреть DBFNavigator)
‚Ž‡‚€’ -> win (если смотреть DBFNavigator)
так вот и твоей функцией я пытаюсь вытащить данные в нормальном виде (читабельном). Так вот ты пользуешься функцией OemToChar, которая сначало побайтно переводит и dos->win и как я понинаю что после этого воспользовшись функцией StrConv(ByteArr, vbUnicode) я должен получить значение ВОЗВРАТ но только уже в win кодировке ? я правильно понимаю?
Мне нужно в ворде заполнить шаблон данными из dbf я так понимаю, что должен все к win кодировке преводить.
Номер ответа: 11
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #11
Добавлено: 19.12.05 19:17
Слушай, ты читать умеешь или тебе написать документацию "BPDBF для чайников"?
Функция StrConv нужна для того чтобы преобразовать байтовый массив в строку. Грубо говоря она конвертирует ANSI в UNICODE, а OemToChar конвертирует OEM в ANSI. Получается цепочка
OEM->ANSI->UNICODE (DOS->Windows->Windows NT).
Фэрштейн?