News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

c++ translate

Started by ragdog, February 04, 2008, 07:54:01 PM

Previous topic - Next topic

ragdog

hi

can your help me with translate a small algo from c++ to masm32 please?
   
I convert a c + + source to masm32
And here I come not Continue


void DoMeta(const char *meta)
{
char *p;
if (meta && (p=strstr(meta,"StreamTitle='"))) {
p=strdup(p+13);
strchr(p,';')[-1]=0;
MESS(30,WM_SETTEXT,0,p);
free(p);
}
}




thanks in forward

ragdog


ToutEnMasm

Hello,
With c++ the better way is to use the option  /FAs  that disassemble the source.


ragdog

thanks

Which I had already done, I found the apis not!

here is the dissambled code


sub_4014EC      proc near             
                                         
var_18          = dword ptr -18h
arg_0           = dword ptr  8

                 push    ebp
                 mov     ebp, esp
                 sub     esp, 14h
                 push    ebx
                 mov     eax, [ebp+arg_0]
                 test    eax, eax
                 jz      short loc_40154C
                 add     esp, 0FFFFFFF8h
              ;   push    offset aStreamtitle ; "StreamTitle='"
                ; push    eax             ; char *
                ; call    strstr       
             invoke StrStr,eax, offset aStreamtitle ; "StreamTitle='"
                 mov     ebx, eax
                 add     esp, 10h
                 test    ebx, ebx
                 jz      short loc_40154C
                 add     esp, 0FFFFFFF4h
                 lea     eax, [ebx+0Dh]
                 push    eax             ; char *
                 call    _strdup    ;  <-----------------------------------------------------------
                 mov     ebx, eax
                 add     esp, 0FFFFFFF8h
                 push    3Bh             ; int
                 push    ebx             ; char *
                 call    strchr    ;  <-----------------------------------------------------------
                 mov     byte ptr [eax-1], 0
                 add     esp, 20h
                 add     esp, 0FFFFFFF4h
                 push    ebx             ; lParam
                 push    0               ; wParam
                 push    0Ch             ; Msg
                 push    1Eh             ; nIDDlgItem
                 push    hWnd            ; hDlg
                 call    SendDlgItemMessageA
                 push    ebx             ; void *
                 call    free    ;  <-----------------------------------------------------------

loc_40154C:                             ; CODE XREF: sub_4014EC+Cj
                                         ; sub_4014EC+23j
                 mov     ebx, [ebp+var_18]
                 leave
                 retn
sub_4014EC      endp

here ist the format

StreamTitle='xxx-songxxx)';StreamUrl='http://www.xxx.com';




best regards
ragdog

ragdog

i have the StrStr algo found in the shlwapi.inc

   
Where can I find these strdup and strchr

can i use the free algo from the m32lib?

i have solved a little

my problem is

push  ebx   ; void *
call    Free 

i use this from m32lib and by this crash ma program

ragdog

here is my solution


ReadTitel     proc lpMetaData :DWORD     
                                         
                 push    ebx
                 mov     eax, lpMetaData
                 test    eax, eax
                 jz      @F
                 
              invoke     StrStr,eax,offset aStreamtitle ; "StreamTitle='"
                 mov     ebx, eax
                 test    ebx, ebx
                 jz      @F

                 lea     eax, [ebx+0Dh]
               invoke    StrDup,eax
                 mov     ebx, eax

               invoke    StrChr ,eax,3Bh
                 mov     byte ptr [eax-1], 0
              invoke     SendDlgItemMessage,hMain,1001,WM_SETTEXT,0,ebx
                ; push    ebx             ; void *
               ;  call    Free    ;  <-----------------------------------------------------------
@@:                           
                pop ebx         
                ret
ReadTitel      endp

MichaelW

The CRT _strdup function calls the CRT malloc function to allocate the buffer, so to free the buffer you need to call the CRT free function, passing it the pointer returned by _strdup.
eschew obfuscation

ragdog

hi

If I use (invoke free,ebx) works that not?!

greets
ragdog

ToutEnMasm

#7
Hello,
Found !
The StrDup function use theĀ  LocalAllocĀ  function to duplicate the string.
You must free the string with LocalFree


Quote
ReadTitel proc uses ebx lpMetaData :DWORD

.if lpMetaData != 0
   invoke StrStr,lpMetaData,addr aStreamtitle ; "StreamTitle="
   mov ebx, eax
   .if ebx != 0
      lea eax, [ebx+0Dh]
      invoke StrDup,eax         ;duplicate
      mov ebx, eax

      invoke StrChr ,ebx,";"
                                .If eax != 0
             mov byte ptr [eax-1], 0
                                .endif
      ;invoke SendDlgItemMessage,hMain,1001,WM_SETTEXT,0,ebx
      invoke LocalFree,ebx
   .endif   
.endif   
ret
ReadTitel endp

ragdog

thanks you ToutEnMasm for this source  :U

thanks you michaelW for your help

best regards
ragdog

ragdog

hi

   
I have a problem with new convert problem a callback proc!

What does this callback function in masm32

c++

void CALLBACK TestProc(
    HSYNC handle,
    DWORD channel,
    DWORD data,
    void *user
);


Is that correct so in masm32?



TestProc     proc handle:DWORD,channel:DWORD,data:DWORD,user:DWORD
                ret
TestProc     endp


disassembler code


TestProc     proc near               ; DATA XREF: DialogFunc+1FEo
                push    ebp
                 mov     ebp, esp
                 sub     esp, 8
                 call    sub_4014EC
                leave
               retn    10h
TestProc      endp




thanks in forward
ragdog

ToutEnMasm


ragdog


ragdog

good morning :bg

How can I call this function??

TestProg       PROTO :DWORD,:DWORD,:QWORD,:DWORD,:DWORD

this crash my program

invoke TestProg ,handle,Met,0,offset TestCallback,0

greets
ragdog

jj2007

One usual syntax for subclassing callbacks is

       invoke SetWindowLong, hControl, GWL_WNDPROC, NameOfCallbackProc

So I wonder if removing the "offset" would help you, or if you should switch to the syntax above, i.e. use SetWindowLong.

ToutEnMasm

Hello,
Post the full source if you want help.