Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: CallBack функция Добавлено: 28.06.03 22:16  

Автор вопроса:  CyRax  | Web-сайт: basicproduction.nm.ru | ICQ: 204447456 

Подскажите как правильно пользоваться на VB Сишной CallBack функцией.
Если можно то применительно к струткуре EDITSTREAM
typedef struct _editstream {
    DWORD dwCookie;
    DWORD dwError;
    EDITSTREAMCALLBACK pfnCallback;
} EDITSTREAM;

Я пробовал делать AddressOf, но у меня не получалось - выбивало VB.
Может я что не так делал?
=== Объявления я помещу в конце(для того чтобы вы не утруждались :)).
Sub StreamFileIn(lpszFileName As String)
 hFile = OpenFile(lpszFileName, ofs, OF_READ)
 est.dwCookie = hFile
 est.dwError = 0
 est.pfnCallback = FnPtrToLong(AddressOf ofCallBack)
 SendMessage hRich, EM_STREAMIN, SF_TEXT, est 'Здесь выбивает VB.
End Sub
Function FnPtrToLong(ByVal lngFnPtr As Long) As Long
   FnPtrToLong = lngFnPtr
End Function
Function ofCallBack(dwCookie As Long, pbBuff As Long, cb As Long, pcb As OVERLAPPED) As Long
ReadFile hFile, dwCookie, pbBuff, cb, pcb
'   ofCallBack=ReadFile (hFile, dwCookie, pbBuff, cb, pcb) тоже не даёт положительного эффекта.
End Function
'Код конечно не полный - нет кода загрузки библиотеки, которую выбивает(RICHED32.DLL). Но, если здесь всё сделано верно, то я вышлю и код загрузки библиотеки и создания контрола.
=== Конец кода / Начало объявлений
Public Type EDITSTREAM
  dwCookie As Long
  dwError As Long
  pfnCallback As Long
End Type
Public est As EDITSTREAM
Public Const OFS_MAXPATHNAME = 128
Public Type OFSTRUCT
        cBytes As Byte
        fFixedDisk As Byte
        nErrCode As Integer
        Reserved1 As Integer
        Reserved2 As Integer
        szPathName(OFS_MAXPATHNAME) As Byte
End Type
Public Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As Long
Public Type OVERLAPPED
        Internal As Long
        InternalHigh As Long
        offset As Long
        OffsetHigh As Long
        hEvent As Long
End Type
Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public hRich As Long, ReDLL As Long
Public hFile As Long, fSiz As Long
Public pcb As OVERLAPPED, ofs As OFSTRUCT
Public dwCookie As Long, pbBuff   As Long, cb   As Long ', pcb   As Long

Public Const OF_READ = &H0
Public Const WM_USER = &H400
Public Const EM_STREAMIN = WM_USER + 73
   
Public Const SF_TEXT = &H1
Public Const SF_RTF = &H2
Public Const SF_RTFNOOBJS = &H3
Public Const SF_TEXTIZED = &H4

Public Const WM_SETTEXT = &HC
Public Const EM_SETMODIFY = &HB9

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 MAGNUS



Вопросов: 12
Ответов: 430
 Профиль | | #1 Добавлено: 30.06.03 19:38

Хм... Че то я не вижу смысла в этом коде:

Function FnPtrToLong(ByVal lngFnPtr As Long) As Long
   FnPtrToLong = lngFnPtr
End Function

Он просто возвращает переданный ему параметр.

А что ты вообще пытаешься сделать?

Ответить

Номер ответа: 2
Автор ответа:
 Vit



Вопросов: 68
Ответов: 62
 Web-сайт: www.home-soft.jino-net.ru
 Профиль | | #2
Добавлено: 02.07.03 10:40

В форме написать:

Private Const GWL_WNDPROC = (-4)
Private Sub Form_Load()
OldWindowProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf CallBackFunc
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call SetWindowLong Me.hwnd, GWL_WNDPROC, OldWindowProc
End Sub

'CallBack - функцию размести в модуле

Public OldWindowProc As Long ' Original window proc
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Function CallBackFunc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long

'код программы

CallBackFunc = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp)
End Function

Ответить

Страница: 1 |

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



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