宣告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...