pb中的記憶體操作大蒐集

2021-06-22 03:56:14 字數 2527 閱讀 1773

我們知道pb中不支援指標,但我們在使用win32 api和呼叫一些dll中的外部函式時候,經常會與其打些交道,所以這裡將相關的一些技巧收集整理起來。

1、根據字串位址得到字串

完全通過pb自帶的函式string就可以實現,函式的語法為string ( data, ),當我們將變數

位址作為data引數,字串「address」作為format引數,函式的返回值就是我們需要的字串。這是種

未公開(呵呵,pb的幫助中找不到),但被廣泛使用的方法。

例:string ls_tmp

ls_tmp =string(hstrdata,"address")

2、得到pb中某個字串變數的位址

這次,單純依靠pb自身是行不通了,需要請來win api函式幫忙了:

主人公:function long lstrcpy(ref string destination, ref string source) library "kernel32.dll"

原型:the lstrcpy function copies a string to a buffer. 

lptstr lstrcpy(

lptstr lpstring1, // address of buffer 

lpctstr lpstring2  // address of string to copy 

); return values:if the function succeeds, the return value is a pointer to the buffer.

看我怎麼大顯身手:

定義例項變數:string is_dst

string ls_src

long ll_address

ls_src= "test me"

ls_dst =space(255)   

ll_address=lstrcpy(ls_dst,ls_src)

麻煩是麻煩點,不過終於知道你藏身在ll_address那裡了。

3、在記憶體堆上分配空間,並儲存變數內容

這裡需要localalloc,localfree,copymemory三個api函式,其中localalloc,localfree用來申請、釋

放記憶體塊,copymemory用來複製記憶體塊。

這裡著重說明一下copymemory函式,有三個引數   

pvoid destination, // address of move destination

const void *source, // address of block to move 

dword length  // size, in bytes, of block to move 

前兩個引數均是指標型別,因此我們可以根據需要在宣告中將其定義為long或者ref ***的形式,反正都

是指變數的位址,根據需要定義嘍!

例:現在某個api用到的結構中有乙個long成員,用來儲存另外乙個結構menuitemdata的位址,以備將來所需

。結構menuitemdata 如下:

type menuitemdata from structure

unsignedlong  hmenu

integer  level

end type

好了,看看怎麼解決這個問題的。

function long localalloc(long flags, long bytes) library "kernel32.dll"

function long localfree(long memhandle) library "kernel32.dll"

subroutine copymemory(long pdesc, ref menuitemdata psrc,ulong size) library "kernel32" alias for "rtlmovememory" 

subroutine copymemory(ref menuitemdata pdesc, long psrc,ulong size) library "kernel32" alias for "rtlmovememory"

例項變數:long il_menudatapointer 

menuitemdata lpmenuitemdata

//下面**將lpmenuitemdata 的內容複製到記憶體塊il_menudatapointer中

lpmenuitemdata.hmenu = 12345

lpmenuitemdata.level = 1

il_menudatapointer= localalloc(0,6) //6=sizeof(menuitemdata)

copymemory(il_menudatapointer,lpmenuitemdata,6)

//那麼,如果再從記憶體塊中取出來呢??

copymemory(lpmenuitemdata,   il_menudatapointer,6)//很簡單吧!

//現在,我不需要 il_menudatapointer這塊記憶體了

localfree(il_menudatapointer)

Powerbuilder中的記憶體操作大蒐集

powerbuilder中的記憶體操作大蒐集 1 根據字串位址得到字串 完全通過pb自帶的函式string就可以實現,函式的語法為string data,當我們將變數位址作為data引數,字串 address 作為format引數,函式的返回值就是我們需要的字串。這是種未公開 呵呵,pb的幫助中找不...

CSS的Hack大蒐集

hack在css的編寫中是經常被用到的一種技術。之所以出現了hack,是因為各個瀏覽器的解析有專屬於自己的寫法的。這也是css的神奇之處之一。不過,hack雖然是如此的好用,作為前端寫 的我們來說,用它絕對是快準狠的解決了問題,但是不太推薦大家用hack。hack的技術是針對不同瀏覽器寫不同的樣式,...

PB對EXECL的常用操作

ole object.workbooks.add 新建乙個excel檔案 ole object.workbooks.open filename 開啟乙個已存在excel檔案 ole object.activeworkbook.sheets sheetname select 選擇檔案中乙個工作表 格式...