SetClipboardData

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 13.01.2005 (Чт) 20:15

Не знаю, чего еще копать и где смотреть. Видимо пробелы у меня там, где я и не подозревал - думаешь, что понимаешь правльно, а на деле..
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 12:23

Слушайте, не могу просто так это бросить. Прогу сдал без этих собственных форматов клипборда. Но,
может, хоть попытается кто объяснить, что же происходит:
Данные помещаются в буфер путем передачи строки Byval, с указанием её длины. В последнем примере длина=182.
Код: Выделить всё
    EmptyClipboard
    hGlobal = GlobalAlloc(GMEM_MOVEABLE Or GMEM_DDESHARE, Len(StrData))
    lpString = GlobalLock(hGlobal)
    CopyMemory lpString, ByVal StrData, Len(StrData)
    GlobalUnlock hGlobal
   
    SetClipboardData CF_FORMAT, hGlobal
   
    CloseClipboard
    GlobalFree hGlobal

Затем когда содержимое буфера считывается - его длина в байтах равна 1/2 от прежней длины, а то и меньше. И байты, из которых он состоит - это бред какой-то, к прежним они отношения не имеют. Что это за черт? :(
Клюк с зарегистрированными форматами или глюк в приведенном коде? Окиньте это "свежим" взглядом
Есть ли у меня вопрос? У меня всегда есть вопрос

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

Сообщение Konst_One » 14.01.2005 (Пт) 12:54

может у тебя проблема в самих данных?

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

Сообщение GSerg » 14.01.2005 (Пт) 13:46

Чё тут окидывать.

hGlobal = GlobalAlloc(GMEM_MOVEABLE Or GMEM_DDESHARE, Len(StrData)*2)
lpString = GlobalLock(hGlobal)
CopyMemory byval lpString, ByVal strptr(StrData), Len(StrData)*2
GlobalUnlock hGlobal
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 13:49

GSerg писал(а):Чё тут окидывать.

hGlobal = GlobalAlloc(GMEM_MOVEABLE Or GMEM_DDESHARE, Len(StrData)*2)
lpString = GlobalLock(hGlobal)
CopyMemory byval lpString, ByVal strptr(StrData), Len(StrData)*2
GlobalUnlock hGlobal

т.е.
Код: Выделить всё
Len(StrData)*2=LenB(StrData)
?
пробовал я это уже.
Результат=The same shit
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 13:50

Konst_One писал(а):может у тебя проблема в самих данных?

Я вот и задаю себе вопрос, что у меня туда попадает? :) :(
Есть ли у меня вопрос? У меня всегда есть вопрос

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

Сообщение GSerg » 14.01.2005 (Пт) 13:53

Слюшай....
Раз у тебя данные строковые, ну не страдай фигнёй, юзай объект clipboard :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение GSerg » 14.01.2005 (Пт) 13:56

Eugenio писал(а):
Konst_One писал(а):может у тебя проблема в самих данных?

Я вот и задаю себе вопрос, что у меня туда попадает? :) :(


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

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 14:10

GSerg писал(а):Туда попадает твоя строка...
Вопрос в том, как ты потом её читаешь.

Гляньте еще на код, достающий данные, я в нем уже ничего не могу подозрительного найти :) . lstrlen возвращает не "половинную" длину данных в буфере, а столько сколько их там есть - используется её ANSI версия (я ради интересу вызвал unicode-версию - длина стала еще вполовину меньше, т.е. в четверть от начальной :) ). Это данных почему-то в половину меньше.

Код: Выделить всё
    OpenClipboard ByVal 0
    hStrPtr = GetClipboardData(CF_FORMAT)
    lpString = GlobalLock(hStrPtr)
   
    If lpString <> 0 Then
        lLength = lstrlen(lpString)
        If lLength > 0 Then
            sBuffer = Space$(lLength)
            CopyMemory StrPtr(sBuffer), lpString, lLength
        End If
    End If


Главное, данные нечитаемые.
Последний раз редактировалось Eugenio 14.01.2005 (Пт) 14:17, всего редактировалось 1 раз.
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 14:14

GSerg писал(а):Слюшай....
Раз у тебя данные строковые, ну не страдай фигнёй, юзай объект clipboard :)

кто меня тут вопрошал "Ты программер или кто?" :).
Прога уже сдана (я ж говорил) - с объектом clipboard и строковыми данными :) - и без некоторых удобств для юзера, соответственно
Есть ли у меня вопрос? У меня всегда есть вопрос

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

Сообщение GSerg » 14.01.2005 (Пт) 14:15

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

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 14:18

Это же BStr, там и так 0 в конце. Или нет?
в середину - нет :)
Последний раз редактировалось Eugenio 14.01.2005 (Пт) 14:20, всего редактировалось 1 раз.
Есть ли у меня вопрос? У меня всегда есть вопрос

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

Сообщение GSerg » 14.01.2005 (Пт) 14:19

Я не спрашиваю, что там в конце. Я спрашиваю, что там в середине :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 14:22

GSerg писал(а):Я не спрашиваю, что там в конце. Я спрашиваю, что там в середине :)

Я как раз и подумал - не про середину ли ты :)
нету там ничего
Есть ли у меня вопрос? У меня всегда есть вопрос

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

Сообщение GSerg » 14.01.2005 (Пт) 14:24

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

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 14:27

GSerg писал(а):Как copymemory объявил?

типа, конечно.
Код: Выделить всё
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(ByVal Destination As Long, Source As Any, ByVal Length As Long)
Есть ли у меня вопрос? У меня всегда есть вопрос

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

Сообщение GSerg » 14.01.2005 (Пт) 14:33

Собственно, я и не сомневался...

CopyMemory StrPtr(sBuffer), byval lpString, lLength
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 14:56

черт, там вот чего не хватало:
Код: Выделить всё
sBuffer = StrConv(sBuffer, vbUnicode)

и вот из-за этого я вам мозги компостировал.. :?

GSerg, у меня мегапробел, я не понял:
что дает ByVal при вызове, если функция декларирована с ByVal?
инвертирует что-ли всё?
Есть ли у меня вопрос? У меня всегда есть вопрос

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

Сообщение GSerg » 14.01.2005 (Пт) 14:58

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

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 15:05

GSerg писал(а):Нет.
У тебя нет Byval на втором аргументе. Поэтому при чтении туда передаётся не указатель, а указатель на указатель.

Слава тебе, форум.
Прикол: как только ты запросил объявление функции, оно мне не понравилось - я по-быстрому вставил ByVal, а до этого - как не видел.. :) :? (вот и спрашивал, зачем ByVal+ByVal)
А потом и про StrConv сообразил.

СПАСИБО! ПОЙДУ НА БАЛКОН, КРИКНУ "СЛАВА GSERG!"
Ох, и надоело собственное головотяпство :lol:
Есть ли у меня вопрос? У меня всегда есть вопрос

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

Сообщение Konst_One » 14.01.2005 (Пт) 15:11

на счет Unicode я тебе сказал еще 2-е страницы назад :D

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 15:11

Хай живе регистрированнi форматi! :lol:
Последний раз редактировалось Eugenio 14.01.2005 (Пт) 15:13, всего редактировалось 1 раз.
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 15:13

Konst_One писал(а):на счет Unicode я тебе сказал еще 2-е страницы назад :D

Я тогда же и ответил. Ты мне предлагал строку в ANSI ковертить перед вставкой (да еще проверять на Unicode) - а строки в VB и так в Unicode и автоматом пребразовываются при передаче в API-функции.
Есть ли у меня вопрос? У меня всегда есть вопрос

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

Сообщение GSerg » 14.01.2005 (Пт) 15:15

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

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 15:19

GSerg писал(а):А то, что показывал я, сохраняет вообще без конвертации...

Не соображу, это что было? :?
Есть ли у меня вопрос? У меня всегда есть вопрос

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

Сообщение GSerg » 14.01.2005 (Пт) 15:23

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

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 15:30

а-а.
Ну, я с LenB поюзал вариант.
Главная-то моя проблема с моим непревзойденным искусством писать Declare и потом их юзать через ж :lol:
Есть ли у меня вопрос? У меня всегда есть вопрос

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

Сообщение GSerg » 14.01.2005 (Пт) 15:34

Умение приходит со времением :)

Потом будешь вообще все параметры объявлять byref as any. Максимальная гибкость при вызове :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 15:55

А что, я уже пробовал, когда работы не мог добиться..
уже не помню от какой API-шки :)
Это тоже не помогло, потому что дело было в версии, а не аргументах :)
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 14.01.2005 (Пт) 16:13

Да! Еще вопрос хочется задать.
Примеры из МСДН с использованием CopyMemory для копирования из строки в массива упорно не работают,
причем, независимо от типа аргументов при объявлении CopyMemory :)
Я чего-то не догоняю, видно, опять.. Хотелось бы понять.
Вот пример:
Код: Выделить всё
sBSTR = "How do you do?"
cBytes = LenB(sBSTR)

' ReDim array, with space for terminating null
ReDim b(1 To cBytes + 2) As Byte

' Point to BSTR char array
lpwsz = StrPtr(sBSTR)

' Copy the array
CopyMemory b(1), ByVal lpwsz, cBytes + 2

' Point lpsz to new array
lpwsz = VarPtr(b(1))
Есть ли у меня вопрос? У меня всегда есть вопрос

Пред.След.

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

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

Сейчас этот форум просматривают: SemrushBot и гости: 1

    TopList