The MASM Forum Archive 2004 to 2012

General Forums => The Campus => Topic started by: minor28 on December 03, 2009, 02:25:41 PM

Title: Macro issue
Post by: minor28 on December 03, 2009, 02:25:41 PM
We have the CTEXT macro. I have tryed to develop it to write a BSTR in data segment like this. BSTR("MyString") to get something like this.



.data
        dd 16
szMyString db "M",0,"y",0,"S",0,"t",0,"r",0,"i",0,"n",0,"g",0,0



for example


BSTR macro y:vararg
LOCAL sym
local buffer[256]:byte

invoke MultiByteToWideChar,CP_ACP,0,y,-1,addr buffer,sizeof buffer

invoke lstrlen,y
shl eax

data segment
eax
sym db buffer,0
data ends

exitm <offset sym>
endm


I haven't the faintest idea how to solve this. Does anybody know how to do it, if it is possible at all?
Title: Re: Macro issue
Post by: drizz on December 03, 2009, 03:50:01 PM
> ObjAsm32 (http://objasm32.winasm.net/repository.htm#start) <

BStrings.inc
Title: Re: Macro issue
Post by: qWord on December 03, 2009, 03:59:49 PM
hi,

see the file in attachment

usage:

wData LableName,"what ever",10,13,"bla"

it creates an dword filled with string size (in bytes) follwed by zero terminated unicode string.

regards, qWord
Title: Re: Macro issue
Post by: jj2007 on December 03, 2009, 05:20:42 PM
Quoteinvoke MessageBoxW, 0, wChr$("Hello Masm32"), wChr$("Unicode in MasmBasic is simple:"), MB_OK

->MasmBasic (http://www.masm32.com/board/index.php?topic=12460)
Title: Re: Macro issue
Post by: minor28 on December 03, 2009, 06:13:45 PM
Thanks qWord. What a complicated macro. I don't understand all of your code but with a few changes it will work fine for my purpose.


wData macro args:VARARG
LOCAL sym
        .
.
.
.
  _Label struct
  db (sizeTotal+2) dup (?) ;; +2 for zero terminator
  _Label ends
 
  data segment
  align 4
;;Number of bytes in the following data string, terminator not include.
dd SIZEOF _Label-2
sym label _Label
  iArg = 0
  REPEAT nArg
IFIDN @CatStr(<wData_Line_>,%(iArg)),<"">
ELSEIFIDN @CatStr(<wData_Line_>,%(iArg)),<''>
ELSEIFB @CatStr(<wData_Line_>,%(iArg))
  ELSE
  dw @CatStr(<wData_Line_>,%(iArg))
  ENDIF
  iArg = iArg + 1
  ENDM
  dw 0
  data ends
 
  exitm <offset sym>
endm


The length prefix does not include the terminator and the label should be at the first undicode character. Sometimes I need the string two times why named label is exchange for sym.

Thank you all for your help.