pb 呼叫dll時關於指標引數處理

2021-05-21 23:34:35 字數 3042 閱讀 9614

宣告dll呼叫時如果有引數是 指標型別時   定義時需要在相應型別前面加上ref 表示傳遞的位址而不內容

ref +簡單型別 

複雜型別 會自動將其位址複製乙份進行傳遞

對複雜型別引數是否被ref修飾的區別是相似的。由於複雜型別引數都以位址方式傳值,因而不被修飾時引數傳遞的是拷貝的位址;被修飾時引數傳遞的是真實位址。

下表說明了引數型別和ref 的關係。

簡單型別

複雜型別

加ref

位址真實位址

不加ref

拷貝拷貝的位址

值得注意的是:結構的成員變數如果是複雜型別的話,雖不能在結構宣告中加ref,但它們將以真實位址方式傳值。此外,結構本身也是複雜型別。因此對結構變數的操作要小心,防止無意中的更改。

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)   //將ls_src的內容複製到ls_dst,並返回ls_dst的儲存位址   

麻煩是麻煩點,不過終於知道你藏身在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)   

用VC建立供PB呼叫的DLL

1 用vs.2003新建vc 專案中的 win32 專案 專案名稱為wxjextend,應用程式型別選擇dll 2 在主 dll 原始檔中輸入 long wxjextend api stdcall bitand long bit1,long bit2 long wxjextend api stdca...

用VC建立供PB呼叫的DLL

1 用vs.2003新建vc 專案中的 win32 專案 專案名稱為wxjextend,應用程式型別選擇dll 2 在主 dll 原始檔中輸入 long wxjextend api stdcall bitand long bit1,long bit2 long wxjextend api stdca...

關於PB呼叫Webservice的有效方法

powerbuilder呼叫webservice客戶端總是有很多問題。proxy方法使用起來有很多限制,對後台webservice服務指令碼有很多要求,對複雜資料型別支援不好。inet方法使用時,對於pb9以下版本存在字符集的問題。pb9使用的是ansi單位元組字符集,而soap xml使用的utf...