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