Под IDE возвращает правильно: >asd*zxc*qwe*< LenB=24
А в скомпилированном виде возвращает >asd
Причем если раскомментировать внизу функции Repl строку "MsgBox sString", то в Native будет возвращаться верная строка. Чудеса в решете...
В чем тут может быть проблема и как сделать, чтобы верная строка возвращалась?
- Код: Выделить всё
Option Explicit
Declare Sub PutMem4 Lib "msvbvm60" (pRet As Any, ByVal lNewVal As Long)
Private m_sMainString As String
Sub Main()
m_sMainString = "asd" + Chr$(0) + "zxc" + Chr$(0) + "qwe" + Chr$(0)
'MsgBox "StrPtr(m_sMainString)=" & Hex(StrPtr(m_sMainString))
If LenB(m_sMainString) Then Repl m_sMainString, 0, 42
MsgBox ">" + m_sMainString + "<" + vbNewLine + "LenB=" + CStr(LenB(m_sMainString))
End Sub
'Функция Хакера быстрой замены символов (http://bbs.vbstreets.ru/viewtopic.php?t=36100)
Function Repl(sString As String, _
ByVal Search As Integer, _
ByVal Replacement As Integer, _
Optional ByVal Stub As Long, _
Optional ByRef Replacer As Integer) As Long
' sString = Replace$(sString, ChrW(0), ChrW(42))
' Exit Function
' По поводу аргументов:
' sString - строка, в которой производится замена
' Search - что ищем
' Replacement - чем заменяем
' Stub - заглушка, Replacer - наш самодельный указатель
Dim CurPos As Long
Dim EndPos As Long
Dim ptrAddress As Long ' Здесь будем хранить VarPtr(Stub)+4
' чтобы каждый раз не считать
CurPos = StrPtr(sString)
'MsgBox "StrPtr(sString)=" & Hex(CurPos)
EndPos = CurPos + LenB(sString)
ptrAddress = VarPtr(Stub) + 4
Do
PutMem4 ByVal ptrAddress, CurPos
' Момент истины:
If Replacer = Search Then Replacer = Replacement ' А вы думали? ;)
CurPos = CurPos + 2 ' Переходим к обработке след. символа
Loop Until CurPos = EndPos
'MsgBox sString
End Function