Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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
Автор ответа:
 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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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
Автор ответа:
 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-сайт: basicproduction.nm.ru
 Профиль | | #11
Добавлено: 19.12.05 19:17
Слушай, ты читать умеешь или тебе написать документацию "BPDBF для чайников"?
Функция StrConv нужна для того чтобы преобразовать байтовый массив в строку. Грубо говоря она конвертирует ANSI в UNICODE, а OemToChar конвертирует OEM в ANSI. Получается цепочка
OEM->ANSI->UNICODE (DOS->Windows->Windows NT).
Фэрштейн?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам