Как получить строку, зная её Pointer?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Как получить строку, зная её Pointer?

Сообщение A.A.Z. » 02.01.2005 (Вс) 22:34

Собственно, сабж :roll:
Думаю, что вопрос, как всегда, ламерский :oops:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.01.2005 (Вс) 22:45

Самый дубовый способ - SysAllocString.
Если знаешь длину этой строки, то можно и привычнее - сделать строку нужной длины и с-CopyMemory-ить туда данные по твоему указателю.
Ещё можно поверх VarPtr(s) перезаписать твой указатель, но только нужно потом не забыть перезаписать его обратно нулём. Это, кстати, единственный способ без копирования данных. Но он подходит, только если перед строкой уже записана её длина (или есть возможность её там записать).
Изображение

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Re: Как получить строку, зная её Pointer?

Сообщение gaidar » 02.01.2005 (Вс) 22:52

A.A.Z. писал(а):Собственно, сабж :roll:
Думаю, что вопрос, как всегда, ламерский :oops:


Не понял. Где ты имеешь указатель на сроку? А вообще, используй функцию CopyMemory.

Код: Выделить всё
void CopyMemory(
  PVOID Destination,
  const VOID* Source,
  SIZE_T Length
);


За описанием - в MSDN :)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 02.01.2005 (Вс) 22:56

2 tyomitch: подскажи, плиз, как дубовым способом пользоваться, куда пихать Pointer и что ждать от pOleChar :oops:
Последний раз редактировалось A.A.Z. 02.01.2005 (Вс) 22:58, всего редактировалось 1 раз.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 02.01.2005 (Вс) 22:57

2 gaidar: указатель получен после StrPtr :) А RtlMoveMemory я пользоваться не умею :(

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 02.01.2005 (Вс) 23:08

А зачем - вот вопрос? При нормальном подходе указатели тебе в VB не нужны.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 02.01.2005 (Вс) 23:12

Это мне так, для прогресса :wink:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.01.2005 (Вс) 23:12

A.A.Z. писал(а):2 tyomitch: подскажи, плиз, как дубовым способом пользоваться, куда пихать Pointer и что ждать от pOleChar :oops:

Руководство по использованию дубового способа
Код: Выделить всё
Option Explicit

Private Declare Function SysAllocString Lib "oleaut32" (ByVal sz As Long) As String

Sub Main()
    Debug.Print StrConv(SysAllocString(StrPtr("Hello!")), vbFromUnicode)
End Sub

Если её объявить в TLB, тогда StrConv будет не нужен.
Изображение

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 02.01.2005 (Вс) 23:14

А, As Long! Да еще и ByVal! Да еще и sz! :shock: А в API-Viewer'е ByRef pOleChar As Byte :? Спасибо! :D

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.01.2005 (Вс) 23:20

Вот, я же говорю, что в API-Viewer-е через раз глюки... :-|

Если строка действительно получена из StrPtr, то вот ещё один способ - без копирования данных строки:
Код: Выделить всё
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Sub Main()
    Debug.Print DerefStr(StrPtr("Hello!"))
End Sub

Private Function DerefStr(ByVal StrPtr As Long) As String
    CopyMemory ByVal VarPtr(DerefStr), StrPtr, 4
End Function
Изображение

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 02.01.2005 (Вс) 23:27

Спасибо, будем разбираться... :roll:

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 03.01.2005 (Пн) 1:23

tyomitch писал(а):Вот, я же говорю, что в API-Viewer-е через раз глюки... :-|


Ну, скажем так, глюки там редко бывают и с примерами обычно все хорошо. Так что не надо лишних слов :)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.01.2005 (Пн) 2:05

Примеры в API-Guide-е, а декларации в API-Viewer-е, а это две разные вещи.
Изображение

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

Сообщение GSerg » 03.01.2005 (Пн) 5:22

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.01.2005 (Пн) 14:13

Ну так ясное дело, что для полноценного машинного перевода, даже с C на VB, нужен искусственный интеллект, который ещё не придумали...
Почему ByRef Byte - мне непонятно. По логике вещей, должно бы стоять ByRef Integer.
Изображение


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

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

Сейчас этот форум просматривают: Google-бот и гости: 24

    TopList