конвертация текста ANSI-UNICODE при импорте/експорте функций

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

конвертация текста ANSI-UNICODE при импорте/експорте функций

Сообщение san* » 25.10.2006 (Ср) 16:56

Однажды в этом форуме выцепил возможность написания dll на визуал бейсик. Решил воспользоваться. Есть експортируемая функция с использованием текстовой переменной. Указую ее с ByRef. При вызове ф-ции туда(в библиотеку dll) присылаются вместо 20 байт текста - 10. Судя по всему кто-то из двух (основная программа или библиотека) сделала переконвертацию ANSI-UNICODE. Подскажите, что делать? Не хочется текст передавать по символам, а потом его собирать.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.10.2006 (Ср) 16:58

Передавай указатель, а не текст.
Lasciate ogni speranza, voi ch'entrate.

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 26.10.2006 (Чт) 12:39

Беру переменную стринг, присваюю ей тескт, передаю по ByRef. Что конкретно мне надо сделать?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.10.2006 (Чт) 12:45

Передавай ByVal StrPtr
Lasciate ogni speranza, voi ch'entrate.

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 26.10.2006 (Чт) 13:50

Где именно писать?
--------------------------------------------------
Ф-ция_в_библиотеке (ByRef Var As String)
-------------------------------------------
Объявление в программе:
Declare Function Ф-ция_в_библиотеке Lib "biblioteka.dll" (ByRef Var As String)
-----------------------------------------
Вызов в программе:
Var="Триклятый текст"
Ф-ция_в_библиотеке (Var)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 26.10.2006 (Чт) 14:13

Declare Function Ф-ция_в_библиотеке Lib "biblioteka.dll" (ByVal Var As String)
Весь мир матрица, а мы в нем потоки байтов!

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 26.10.2006 (Чт) 14:20

А вдругих местах ByRef?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.10.2006 (Чт) 15:10

Я имел ввиду ByVal As Long.
А в других местах -- StrPtr или указатель на SysAllocateString/GlobalAlloc/GlobalLock
Lasciate ogni speranza, voi ch'entrate.

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 26.10.2006 (Чт) 16:31

Спасиибо. Это получилось. Но появилась новая проблема. В библиотеке объявляю структурный тип. Объявляю статический массив этого типа. Хочу что-то присвоить полю - выбивает программа. Когда библиотека была обычной программой, то все работало отлично.

Может открыть новую тему :?

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 26.10.2006 (Чт) 17:02

Оказалось, что при объявлении масива ка Приват или Паблик, программа выбивает. Получется, что в длл нельзя пользоваться глобальными массивами?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.10.2006 (Чт) 17:21

что, что :?:

какие еще паблик массивы? в каком месте DLL вы их декларируете и как используете?

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 26.10.2006 (Чт) 17:27

У меня длл состоит из модулей. Функции модулей между собой логически связаны через паблик массивы. Когда-то проект был прстой программой на ВБ. Но пришло время его оформить в виде библиотеки. И вот такая вот загогулина получилась, что локально объявленые массивы работают, а паблик - нет.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 26.10.2006 (Чт) 17:30

Давай-ка код.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 26.10.2006 (Чт) 17:48

Код в длл типа следующего:
Код: Выделить всё
Public m(1 To 120) As integer
Public Sub sub1()
      m(1) = 1
end sub

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.10.2006 (Чт) 17:52

Код: Выделить всё
Private m(1 To 120) As Integer
Public Function ValueGet(ByVal Index As Long) As Integer
  ValueGet = m(Index)
End Function

Какие, нафиг, массивы в Native DLL.
Lasciate ogni speranza, voi ch'entrate.

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 26.10.2006 (Чт) 18:18

Извините за мою безграмотность, но насчет "Какие, нафиг, массивы в Native DLL" я нифига не понял.
К масивам типа Приват и Паблик напрямую вобще нельзя доступаться в длл? Почему? :?
Мне не нужно доступаться из внешней проги, а внутри самой длл.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 26.10.2006 (Чт) 18:21

Если в модуле ты их объявляешь то можно
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 26.10.2006 (Чт) 18:27

А уменя че-то не получается. Код, который я привел выше приводит к ошибке обращения в молоко, когда я вызываю функцию sub1 из внешней программы.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.10.2006 (Чт) 18:31

ANDLL, это как? Так?
Declare Array m Lib "biblioteka.dll" (Index As Long) As Integer
Lasciate ogni speranza, voi ch'entrate.

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 26.10.2006 (Чт) 18:36

Я на всякий случай повторю:мне нужно доступаться к масиву внутри самой длл, а не извне.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 26.10.2006 (Чт) 18:39

alibek писал(а):ANDLL, это как? Так?
Declare Array m Lib "biblioteka.dll" (Index As Long) As Integer

san* писал(а):Извините за мою безграмотность, но насчет "Какие, нафиг, массивы в Native DLL" я нифига не понял.
К масивам типа Приват и Паблик напрямую вобще нельзя доступаться в длл? Почему? :?
Мне не нужно доступаться из внешней проги, а внутри самой длл.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.10.2006 (Пт) 3:23

san*, если ты увидел в топике про native dll только саму native dll и пропустил мысли о том, что это чисто академический пример, в котором куча серьёзных недостатков, делающих невозможным его нормальное использование, то ты ССЗБ.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 27.10.2006 (Пт) 10:33

Gserg, я понимаю Ваш шаманский взгляд, но я в форум залез не из-за чисто академичиских соображений. У меня конкретная проблема и ее нужно решить. Мне нужно использовать готовый кусок программы как библиотеку. На С++ писать или на Delphi у меня нет никакого желания. Если есть возможность зделать это на ВБ- это отлично. Если нет, придется делать ActiveX.dll, чего я тоже не умею.
Есть у кого-то решение моей проблемы, помогите пожалуйста.
P.S. Я не знаю, что значит ССЗБ, и попрошу не обзываться, ведь в правилах форума насколько я понимаю этого делать нельзя.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.10.2006 (Пт) 10:37

san* писал(а):У меня конкретная проблема и ее нужно решить. Мне нужно использовать готовый кусок программы как библиотеку.

Уже лучше. Описание настоящей, исходной проблемы подошло бы совсем хорошо.

san* писал(а):Если нет, придется делать ActiveX.dll, чего я тоже не умею.

Если для тебя нет разницы, использовать native dll или activex, значит совершенно точно ты плохо представляешь, что и зачем ты делаешь. Опиши исходную задачу.

san* писал(а):P.S. Я не знаю, что значит ССЗБ

Сам себе злобный буратино. Выражение, используемое в случаях, когда человек сознательно косит траву в противогазе.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 27.10.2006 (Пт) 10:38

san*
Если так, то тебе нужно создать класс и установить у него свойство Instancing = GlobalMultyUse.
Тогде все его открытые методы будут "глобальными" внутри другого приложения.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot] и гости: 42

    TopList