Powerbuilder中的內存操作大搜集
2024-07-21 02:10:01
供稿:網友
我們知道pb中不支持指針,但我們在使用win32 api和調用一些dll中的外部函數時候,經常會與其打些交道,所以這里將相關的一些技巧收集整理起來。
1、根據字符串地址得到字符串
完全通過pb自帶的函數string就可以實現,函數的語法為string ( data, { format } ),當我們將變量
地址作為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 levelend 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 = 12345lpmenuitemdata.level = 1il_menudatapointer= localalloc(0,6) //6=sizeof(menuitemdata)copymemory(il_menudatapointer,lpmenuitemdata,6)
//那么,如果再從內存塊中取出來呢??copymemory(lpmenuitemdata, il_menudatapointer,6)//很簡單吧!
//現在,我不需要 il_menudatapointer這塊內存了localfree(il_menudatapointer)
搜集中......................waiting..........................
,歡迎訪問網頁設計愛好者web開發。