DevX Home    Today's Headlines   Articles Archive   Tip Bank   Forums   

Page 3 of 4 FirstFirst 1234 LastLast
Results 31 to 45 of 59

Thread: callback function

  1. #31
    Mike Culley Guest

    Re: callback function


    Jason,

    Please see my reply to Jonathan for comments on the code.

    >Also, since TimerProc is Public, any client can call this method, which

    is
    >problematic at best.


    This is true, but I have not found a way around this. If you are wrapping
    this in a dll you could solve this by wrapping the class.

    I have tried this with Hooks and Subclassing also with no problems, but the
    Class_Initialise routine had to be changed because the timerProc is a sub
    and the others are functions.

    Michael Culley

    "Jason Bock" <jrbock@execpc.com> wrote:
    >It looks interesting, but your Class_Initialize method is confusing at best,
    >and to me that is where the core of your code is. It ~appears~ that you

    are
    >walking the vtable of your clsTimer object and finding out where your
    >TimerProc method lies, but it's hard to tell. If you could explain just
    >what you are doing and why you are doing all of the CopyMemory calls and

    why
    >you chose all of the values for mbytData, that would help out a lot. Also,
    >since TimerProc is Public, any client can call this method, which is
    >problematic at best. I realize that if you are walking the vtable, you
    >really didn't have a choice in this case, but this leads to programming

    by
    >convention (i.e. the client has to know not to call this method).
    >
    >Also, have you tested this out with any other APIs that require a callback?
    >
    >Regards,
    >
    >Jason
    >
    >"Michael Culley" <m_culley@one.net.au> wrote in message
    >news:392d30a5$1@news.devx.com...
    >>
    >> It is available at
    >>
    >> www.VBDotCom.com
    >>
    >> Click on free code. The timer is the last item in the list.
    >>
    >> It is not necessary to use VB4 to test it, it works also in vb5 and 6.
    >>
    >> Michael Culley

    >
    >
    >



  2. #32
    Mike Culley Guest

    Re: callback function


    Jonathan,

    >Yep, he didn't want to answer the question here.


    I had to look at the code to refresh my memory of how it works. It was only
    a few hours.

    I must apologise for my lack of comments. I have been working my normal job
    + a second after hours + weekends. I had very little time to prepare this
    code, but stayed up late to finish it. Anyway I will explain how it works.

    The code in the array mbytData is assembly code. The callback goes into mbytData(0).
    The assembly code then calls the timer proc. To have a look at the code,
    add/change this code:

    ReDim mbytData(-1 To 64)
    mbytData(-1) = &HCC

    mlngTimerId = SetTimer(0&, 0&, mlngInterval, lngz(0) - 1)

    This will cause a break and you can view the code in C++

    This code uses the SetRect API as a substitute for the VarPtr function and
    the copy memory API as a substitute for ObjPtr

    'My comments are still pretty crappy, it is not my forte. I will modify this
    routine to be a bit easier to follow tonight.

    Private Sub Class_Initialize()
    Dim lngX As Long
    Dim lngz(3) As Long
    ReDim mbytData(-1 To 64)
    mbytData(-1) = &HCC'Int 03 to see code in a debugger
    mbytData(0) = &HA1
    SetRectLng lngz(0), mblnReEntrant, 0, 0, 0'put VarPtr(mblnReentrant)
    in lngz(0)
    CopyMemory mbytData(1), lngz(0), 4'put varPtr(mblnReentrant) in byte
    array
    CopyMemory mbytData(5), &H7400F883, 4
    CopyMemory mbytData(9), &H10C203, 4
    mbytData(13) = &HB8
    CopyMemory mbytData(14), &HFFFF, 4'This line should read &HFFFF&
    mbytData(18) = &HA3
    CopyMemory mbytData(19), lngz(0), 4
    For lngX = 0 To 3
    mbytData(23 + lngX * 5) = &H8B
    CopyMemory mbytData(24 + lngX * 5), &H50102444, 4
    Next
    mbytData(43) = &H68
    CopyMemory lngX, Me, 4'get objPtr(me) to push This on stack
    CopyMemory mbytData(44), lngX, 4
    CopyMemory lngX, Me, 4'get objPtr(me)
    CopyMemory lngX, ByVal lngX, 4'get pointer to VTable
    CopyMemory lngX, ByVal lngX + &H1C, 4'get pointer to TimerProc
    mbytData(48) = &HE8
    SetRectByt lngz(0), mbytData(49), 0, 0, 0
    CopyMemory mbytData(49), lngX - lngz(0) - 4, 4
    mbytData(53) = &H33
    mbytData(54) = &HC0
    mbytData(55) = &HA3
    SetRectLng lngz(0), mblnReEntrant, 0, 0, 0'get pointer to Reentrant variable
    CopyMemory mbytData(56), lngz(0), 4
    mbytData(60) = &HC2'return
    mbytData(61) = &H10
    mbytData(62) = &H0
    End Sub


    'get value of mblnReentrant
    mov eax,[00179DB8]
    'compare to zero (False)
    cmp eax,0
    'jump over next instruction if mblnReentrant=False
    je 00196D56
    'Execution is already in timerProc so don't call it again
    ret 10h
    'This should be FFFFFFFF (True) - i don't know how it got like this
    'but does not matter as any non zero value will work
    mov eax,0C203FFFFh
    'Set mblnReentrant=True

    '------Start setting up stack to call COM routine (TimerProc)
    mov [00179DB8],eax
    'Get hWnd param
    mov eax,dword ptr [esp+10h]
    'Push hWnd on stack
    00196D64 50 push eax
    'Get Msg param
    00196D65 8B 44 24 10 mov eax,dword ptr [esp+10h]
    'push msg
    00196D69 50 push eax
    'get idEvent
    00196D6A 8B 44 24 10 mov eax,dword ptr [esp+10h]
    'push idEvent on stack
    00196D6E 50 push eax
    'get dwTime
    00196D6F 8B 44 24 10 mov eax,dword ptr [esp+10h]
    'push dwTime on stack
    00196D73 50 push eax
    'push This
    00196D74 68 78 9D 17 00 push 179D78h
    'call timerProc
    00196D79 E8 4D 35 FF FF call 0018A2CB
    'set eax to zero
    00196D7E 33 C0 xor eax,eax
    'mblnReentrant=0 (false)
    00196D80 A3 B8 9D 17 00 mov [00179DB8],eax
    'return, remove parameters from stack
    00196D85 C2 10 00 ret 10h


    Michael Culley


    "Jonathan Wood" <jwood@softcircuits.com> wrote:
    >Yep, he didn't want to answer the question here. Then he posts some code
    >that has hardly a comment.
    >
    >I for one would not assume this code will always work reliably given what

    I
    >know. Maybe if I get some time, I'll try to go through it some time.
    >
    >--
    >Jonathan Wood
    >SoftCircuits Programming
    >http://www.softcircuits.com
    >
    >Jason Bock <jrbock@execpc.com> wrote in message
    >news:392d4455$1@news.devx.com...
    >> It looks interesting, but your Class_Initialize method is confusing at

    >best,
    >> and to me that is where the core of your code is. It ~appears~ that you

    >are
    >> walking the vtable of your clsTimer object and finding out where your
    >> TimerProc method lies, but it's hard to tell. If you could explain just
    >> what you are doing and why you are doing all of the CopyMemory calls and

    >why
    >> you chose all of the values for mbytData, that would help out a lot.

    >Also,
    >> since TimerProc is Public, any client can call this method, which is
    >> problematic at best. I realize that if you are walking the vtable, you
    >> really didn't have a choice in this case, but this leads to programming

    by
    >> convention (i.e. the client has to know not to call this method).
    >>
    >> Also, have you tested this out with any other APIs that require a

    >callback?
    >>
    >> Regards,
    >>
    >> Jason
    >>
    >> "Michael Culley" <m_culley@one.net.au> wrote in message
    >> news:392d30a5$1@news.devx.com...
    >> >
    >> > It is available at
    >> >
    >> > www.VBDotCom.com
    >> >
    >> > Click on free code. The timer is the last item in the list.
    >> >
    >> > It is not necessary to use VB4 to test it, it works also in vb5 and

    6.
    >> >
    >> > Michael Culley

    >>
    >>
    >>

    >
    >


  3. #33
    Mike Culley Guest

    Re: callback function


    Jonathan,

    >Yep, he didn't want to answer the question here.


    I had to look at the code to refresh my memory of how it works. It was only
    a few hours.

    I must apologise for my lack of comments. I have been working my normal job
    + a second after hours + weekends. I had very little time to prepare this
    code, but stayed up late to finish it. Anyway I will explain how it works.

    The code in the array mbytData is assembly code. The callback goes into mbytData(0).
    The assembly code then calls the timer proc. To have a look at the code,
    add/change this code:

    ReDim mbytData(-1 To 64)
    mbytData(-1) = &HCC

    mlngTimerId = SetTimer(0&, 0&, mlngInterval, lngz(0) - 1)

    This will cause a break and you can view the code in C++

    This code uses the SetRect API as a substitute for the VarPtr function and
    the copy memory API as a substitute for ObjPtr

    'My comments are still pretty crappy, it is not my forte. I will modify this
    routine to be a bit easier to follow tonight.

    Private Sub Class_Initialize()
    Dim lngX As Long
    Dim lngz(3) As Long
    ReDim mbytData(-1 To 64)
    mbytData(-1) = &HCC'Int 03 to see code in a debugger
    mbytData(0) = &HA1
    SetRectLng lngz(0), mblnReEntrant, 0, 0, 0'put VarPtr(mblnReentrant)
    in lngz(0)
    CopyMemory mbytData(1), lngz(0), 4'put varPtr(mblnReentrant) in byte
    array
    CopyMemory mbytData(5), &H7400F883, 4
    CopyMemory mbytData(9), &H10C203, 4
    mbytData(13) = &HB8
    CopyMemory mbytData(14), &HFFFF, 4'This line should read &HFFFF&
    mbytData(18) = &HA3
    CopyMemory mbytData(19), lngz(0), 4
    For lngX = 0 To 3
    mbytData(23 + lngX * 5) = &H8B
    CopyMemory mbytData(24 + lngX * 5), &H50102444, 4
    Next
    mbytData(43) = &H68
    CopyMemory lngX, Me, 4'get objPtr(me) to push This on stack
    CopyMemory mbytData(44), lngX, 4
    CopyMemory lngX, Me, 4'get objPtr(me)
    CopyMemory lngX, ByVal lngX, 4'get pointer to VTable
    CopyMemory lngX, ByVal lngX + &H1C, 4'get pointer to TimerProc
    mbytData(48) = &HE8
    SetRectByt lngz(0), mbytData(49), 0, 0, 0
    CopyMemory mbytData(49), lngX - lngz(0) - 4, 4
    mbytData(53) = &H33
    mbytData(54) = &HC0
    mbytData(55) = &HA3
    SetRectLng lngz(0), mblnReEntrant, 0, 0, 0'get pointer to Reentrant variable
    CopyMemory mbytData(56), lngz(0), 4
    mbytData(60) = &HC2'return
    mbytData(61) = &H10
    mbytData(62) = &H0
    End Sub


    'get value of mblnReentrant
    mov eax,[00179DB8]
    'compare to zero (False)
    cmp eax,0
    'jump over next instruction if mblnReentrant=False
    je 00196D56
    'Execution is already in timerProc so don't call it again
    ret 10h
    'This should be FFFFFFFF (True) - i don't know how it got like this
    'but does not matter as any non zero value will work
    mov eax,0C203FFFFh
    'Set mblnReentrant=True

    '------Start setting up stack to call COM routine (TimerProc)
    mov [00179DB8],eax
    'Get hWnd param
    mov eax,dword ptr [esp+10h]
    'Push hWnd on stack
    00196D64 50 push eax
    'Get Msg param
    00196D65 8B 44 24 10 mov eax,dword ptr [esp+10h]
    'push msg
    00196D69 50 push eax
    'get idEvent
    00196D6A 8B 44 24 10 mov eax,dword ptr [esp+10h]
    'push idEvent on stack
    00196D6E 50 push eax
    'get dwTime
    00196D6F 8B 44 24 10 mov eax,dword ptr [esp+10h]
    'push dwTime on stack
    00196D73 50 push eax
    'push This
    00196D74 68 78 9D 17 00 push 179D78h
    'call timerProc
    00196D79 E8 4D 35 FF FF call 0018A2CB
    'set eax to zero
    00196D7E 33 C0 xor eax,eax
    'mblnReentrant=0 (false)
    00196D80 A3 B8 9D 17 00 mov [00179DB8],eax
    'return, remove parameters from stack
    00196D85 C2 10 00 ret 10h


    Michael Culley


    "Jonathan Wood" <jwood@softcircuits.com> wrote:
    >Yep, he didn't want to answer the question here. Then he posts some code
    >that has hardly a comment.
    >
    >I for one would not assume this code will always work reliably given what

    I
    >know. Maybe if I get some time, I'll try to go through it some time.
    >
    >--
    >Jonathan Wood
    >SoftCircuits Programming
    >http://www.softcircuits.com
    >
    >Jason Bock <jrbock@execpc.com> wrote in message
    >news:392d4455$1@news.devx.com...
    >> It looks interesting, but your Class_Initialize method is confusing at

    >best,
    >> and to me that is where the core of your code is. It ~appears~ that you

    >are
    >> walking the vtable of your clsTimer object and finding out where your
    >> TimerProc method lies, but it's hard to tell. If you could explain just
    >> what you are doing and why you are doing all of the CopyMemory calls and

    >why
    >> you chose all of the values for mbytData, that would help out a lot.

    >Also,
    >> since TimerProc is Public, any client can call this method, which is
    >> problematic at best. I realize that if you are walking the vtable, you
    >> really didn't have a choice in this case, but this leads to programming

    by
    >> convention (i.e. the client has to know not to call this method).
    >>
    >> Also, have you tested this out with any other APIs that require a

    >callback?
    >>
    >> Regards,
    >>
    >> Jason
    >>
    >> "Michael Culley" <m_culley@one.net.au> wrote in message
    >> news:392d30a5$1@news.devx.com...
    >> >
    >> > It is available at
    >> >
    >> > www.VBDotCom.com
    >> >
    >> > Click on free code. The timer is the last item in the list.
    >> >
    >> > It is not necessary to use VB4 to test it, it works also in vb5 and

    6.
    >> >
    >> > Michael Culley

    >>
    >>
    >>

    >
    >


  4. #34
    Karl E. Peterson Guest

    Re: callback function

    Hi Jonathan / Jason / Mike --

    > I for one would not assume this code will always work reliably given what I
    > know. Maybe if I get some time, I'll try to go through it some time.


    I still say it's easier to just upgrade and be done with it! :-)

    Later... Karl
    --
    http://www.mvps.org/vb




  5. #35
    Karl E. Peterson Guest

    Re: callback function

    Hi Jonathan / Jason / Mike --

    > I for one would not assume this code will always work reliably given what I
    > know. Maybe if I get some time, I'll try to go through it some time.


    I still say it's easier to just upgrade and be done with it! :-)

    Later... Karl
    --
    http://www.mvps.org/vb




  6. #36
    Mike Culley Guest

    Re: callback function


    Karl,

    >I still say it's easier to just upgrade and be done with it! :-)


    This code has some advantage in VB5/6. You don't have to go to the trouble
    of sorting out where the callback should go from a list of object pointers
    + is faster for this reason. Also, the timer is a single class so is more
    encapsulated.

    Michael Culley

    "Karl E. Peterson" <karl@mvps.org> wrote:
    >Hi Jonathan / Jason / Mike --
    >
    >> I for one would not assume this code will always work reliably given what

    I
    >> know. Maybe if I get some time, I'll try to go through it some time.

    >
    >I still say it's easier to just upgrade and be done with it! :-)
    >
    >Later... Karl
    >--
    >http://www.mvps.org/vb
    >
    >
    >



  7. #37
    Mike Culley Guest

    Re: callback function


    Karl,

    >I still say it's easier to just upgrade and be done with it! :-)


    This code has some advantage in VB5/6. You don't have to go to the trouble
    of sorting out where the callback should go from a list of object pointers
    + is faster for this reason. Also, the timer is a single class so is more
    encapsulated.

    Michael Culley

    "Karl E. Peterson" <karl@mvps.org> wrote:
    >Hi Jonathan / Jason / Mike --
    >
    >> I for one would not assume this code will always work reliably given what

    I
    >> know. Maybe if I get some time, I'll try to go through it some time.

    >
    >I still say it's easier to just upgrade and be done with it! :-)
    >
    >Later... Karl
    >--
    >http://www.mvps.org/vb
    >
    >
    >



  8. #38
    Jonathan Wood Guest

    Re: callback function

    Mike,

    > I had to look at the code to refresh my memory of how it works. It was

    only
    > a few hours.
    >
    > I must apologise for my lack of comments. I have been working my normal

    job
    > + a second after hours + weekends. I had very little time to prepare this
    > code, but stayed up late to finish it. Anyway I will explain how it works.


    Certainly interesting. I'll need a little time to go through all that.

    Thanks.

    --
    Jonathan Wood
    SoftCircuits Programming
    http://www.softcircuits.com




  9. #39
    Jonathan Wood Guest

    Re: callback function

    Mike,

    > I had to look at the code to refresh my memory of how it works. It was

    only
    > a few hours.
    >
    > I must apologise for my lack of comments. I have been working my normal

    job
    > + a second after hours + weekends. I had very little time to prepare this
    > code, but stayed up late to finish it. Anyway I will explain how it works.


    Certainly interesting. I'll need a little time to go through all that.

    Thanks.

    --
    Jonathan Wood
    SoftCircuits Programming
    http://www.softcircuits.com




  10. #40
    Michael \(michka\) Kaplan Guest

    Re: callback function

    I don't think that anyone would consider this code to be easier or more
    maintainable than the AddressOf call.

    Karl is right, upgrade is easier.

    --
    MichKa
    "Cause it's a bittersweet symphony, thats life..." -- The Verve

    random junk of dubious value, at the multilingual,
    no scripts required, http://www.trigeminal.com/

    "Mike Culley" <m_culley@one.net.au> wrote in message
    news:392db408$1@news.devx.com...
    >
    > Karl,
    >
    > >I still say it's easier to just upgrade and be done with it! :-)

    >
    > This code has some advantage in VB5/6. You don't have to go to the trouble
    > of sorting out where the callback should go from a list of object pointers
    > + is faster for this reason. Also, the timer is a single class so is more
    > encapsulated.
    >
    > Michael Culley
    >
    > "Karl E. Peterson" <karl@mvps.org> wrote:
    > >Hi Jonathan / Jason / Mike --
    > >
    > >> I for one would not assume this code will always work reliably given

    what
    > I
    > >> know. Maybe if I get some time, I'll try to go through it some time.

    > >
    > >I still say it's easier to just upgrade and be done with it! :-)
    > >
    > >Later... Karl
    > >--
    > >http://www.mvps.org/vb
    > >
    > >
    > >

    >




  11. #41
    Michael \(michka\) Kaplan Guest

    Re: callback function

    I don't think that anyone would consider this code to be easier or more
    maintainable than the AddressOf call.

    Karl is right, upgrade is easier.

    --
    MichKa
    "Cause it's a bittersweet symphony, thats life..." -- The Verve

    random junk of dubious value, at the multilingual,
    no scripts required, http://www.trigeminal.com/

    "Mike Culley" <m_culley@one.net.au> wrote in message
    news:392db408$1@news.devx.com...
    >
    > Karl,
    >
    > >I still say it's easier to just upgrade and be done with it! :-)

    >
    > This code has some advantage in VB5/6. You don't have to go to the trouble
    > of sorting out where the callback should go from a list of object pointers
    > + is faster for this reason. Also, the timer is a single class so is more
    > encapsulated.
    >
    > Michael Culley
    >
    > "Karl E. Peterson" <karl@mvps.org> wrote:
    > >Hi Jonathan / Jason / Mike --
    > >
    > >> I for one would not assume this code will always work reliably given

    what
    > I
    > >> know. Maybe if I get some time, I'll try to go through it some time.

    > >
    > >I still say it's easier to just upgrade and be done with it! :-)
    > >
    > >Later... Karl
    > >--
    > >http://www.mvps.org/vb
    > >
    > >
    > >

    >




  12. #42
    Michael \(michka\) Kaplan Guest

    Re: callback function

    More or less. I can't believe anyone would talk about his code as being
    superior in any way, other than the fact that it allows things to work at
    all on an inferior platform (which VB4 is, in every way!).

    --
    MichKa
    "Cause it's a bittersweet symphony, thats life..." -- The Verve

    random junk of dubious value, at the multilingual,
    no scripts required, http://www.trigeminal.com/

    "Paul Clement" <UseAdddressAtEndofMessage@swspectrum.com> wrote in message
    news:fpkqisg8v4si6fle2iuerva5kf44v3oln6@4ax.com...
    > On 25 May 2000 06:54:45 -0700, "Michael Culley" <m_culley@one.net.au>

    wrote:
    >
    >
    > It is available at
    >
    > www.VBDotCom.com
    >
    > Click on free code. The timer is the last item in the list.
    >
    > It is not necessary to use VB4 to test it, it works also in vb5 and 6.
    >
    > So, is this how "invalid page faults" are generated? ;-)
    >
    >
    > Paul ~~~ pclement@ameritech.net
    > Microsoft MVP (Visual Basic)




  13. #43
    Michael \(michka\) Kaplan Guest

    Re: callback function

    More or less. I can't believe anyone would talk about his code as being
    superior in any way, other than the fact that it allows things to work at
    all on an inferior platform (which VB4 is, in every way!).

    --
    MichKa
    "Cause it's a bittersweet symphony, thats life..." -- The Verve

    random junk of dubious value, at the multilingual,
    no scripts required, http://www.trigeminal.com/

    "Paul Clement" <UseAdddressAtEndofMessage@swspectrum.com> wrote in message
    news:fpkqisg8v4si6fle2iuerva5kf44v3oln6@4ax.com...
    > On 25 May 2000 06:54:45 -0700, "Michael Culley" <m_culley@one.net.au>

    wrote:
    >
    >
    > It is available at
    >
    > www.VBDotCom.com
    >
    > Click on free code. The timer is the last item in the list.
    >
    > It is not necessary to use VB4 to test it, it works also in vb5 and 6.
    >
    > So, is this how "invalid page faults" are generated? ;-)
    >
    >
    > Paul ~~~ pclement@ameritech.net
    > Microsoft MVP (Visual Basic)




  14. #44
    Karl E. Peterson Guest

    Re: callback function

    Hi Mike --

    I don't dispute it isn't interesting, but it's clear that the disadvantages far
    outweigh any advantages it may or may not offer. Just my opinion, of course.

    Later... Karl
    --
    http://www.mvps.org/vb


    "Mike Culley" <m_culley@one.net.au> wrote in message news:392db408$1@news.devx.com...
    >
    > Karl,
    >
    > >I still say it's easier to just upgrade and be done with it! :-)

    >
    > This code has some advantage in VB5/6. You don't have to go to the trouble
    > of sorting out where the callback should go from a list of object pointers
    > + is faster for this reason. Also, the timer is a single class so is more
    > encapsulated.
    >
    > Michael Culley
    >
    > "Karl E. Peterson" <karl@mvps.org> wrote:
    > >Hi Jonathan / Jason / Mike --
    > >
    > >> I for one would not assume this code will always work reliably given what

    > I
    > >> know. Maybe if I get some time, I'll try to go through it some time.

    > >
    > >I still say it's easier to just upgrade and be done with it! :-)
    > >
    > >Later... Karl
    > >--
    > >http://www.mvps.org/vb
    > >
    > >
    > >

    >




  15. #45
    Karl E. Peterson Guest

    Re: callback function

    Hi Mike --

    I don't dispute it isn't interesting, but it's clear that the disadvantages far
    outweigh any advantages it may or may not offer. Just my opinion, of course.

    Later... Karl
    --
    http://www.mvps.org/vb


    "Mike Culley" <m_culley@one.net.au> wrote in message news:392db408$1@news.devx.com...
    >
    > Karl,
    >
    > >I still say it's easier to just upgrade and be done with it! :-)

    >
    > This code has some advantage in VB5/6. You don't have to go to the trouble
    > of sorting out where the callback should go from a list of object pointers
    > + is faster for this reason. Also, the timer is a single class so is more
    > encapsulated.
    >
    > Michael Culley
    >
    > "Karl E. Peterson" <karl@mvps.org> wrote:
    > >Hi Jonathan / Jason / Mike --
    > >
    > >> I for one would not assume this code will always work reliably given what

    > I
    > >> know. Maybe if I get some time, I'll try to go through it some time.

    > >
    > >I still say it's easier to just upgrade and be done with it! :-)
    > >
    > >Later... Karl
    > >--
    > >http://www.mvps.org/vb
    > >
    > >
    > >

    >




Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center
 
 
FAQ
Latest Articles
Java
.NET
XML
Database
Enterprise
Questions? Contact us.
C++
Web Development
Wireless
Latest Tips
Open Source


   Development Centers

   -- Android Development Center
   -- Cloud Development Project Center
   -- HTML5 Development Center
   -- Windows Mobile Development Center