中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
怎樣才能返回一個(gè)PChar類型從DLL函數(shù)的VB6應(yīng)用程序,而不用擔(dān)心崩潰或內(nèi)存泄漏?

怎樣才能返回一個(gè)PChar類型從DLL函數(shù)的VB6應(yīng)用程序,而不用擔(dān)心崩潰或內(nèi)存泄漏?



delphi dll vb6 string
我要?jiǎng)?chuàng)建一個(gè)DLL由VB6應(yīng)用程序。他們的這個(gè)DLL必須提供多種函數(shù),必須返回字符串。 這是VB6的聲明:
Declare Function MyProc Lib "mylib.dll" (ByVal Param As String) As String
而這在Delphi中存根mylib.dll
function MyProc(AParam: PChar): PChar; stdcall;var ReturnValue: string;begin ReturnValue := GetReturnValue(AParam); Result := ???;end;
我有什么回到這里?誰(shuí)將會(huì)釋放returnd PChar類型字符串? 編輯:我問了Delphi 2005(PChar=PAnsiChar
本文地址 :CodeGo.net/97743/
-------------------------------------------------------------------------------------------------------------------------
1. 你需要制定一個(gè)BSTR代替。 VB6的字符串實(shí)際上是BSTR的。在delphi端調(diào)用SysAllocString()和BSTR返回VB6的一面。 VB6的一方將不得不調(diào)用SysFreeString()來(lái)釋放該字符串-它會(huì)自動(dòng)做到這一點(diǎn)。 如果PChar類型對(duì)應(yīng)一個(gè)ANSI字符串(你的情況下),你必須手動(dòng)將其轉(zhuǎn)換為Unicode-使用MultiByteToWideChar()了點(diǎn)??吹竭@個(gè)答案如何SysAllocStringLen()和MultiByteToWideChar()在一起。
2. 如果你不想adventure崩潰泄漏,然后制作您的Windows API的一個(gè)模型。在那里,API函數(shù)一般不分配他們相反,調(diào)用者傳遞一個(gè)緩沖區(qū),告訴API有多大的緩沖區(qū)。該API填充緩沖區(qū)達(dá)到了極限。請(qǐng)參閱GetWindowText函數(shù),例如。函數(shù)不返回指針 CodeGo.net,除非他們是指針,調(diào)用者已經(jīng)提供的東西。相反,調(diào)用者提供了自己的一切,不管它給該函數(shù)。你幾乎從來(lái)沒有看到一個(gè)輸出緩沖區(qū)不是由另一個(gè)告訴緩沖區(qū)的大小。 進(jìn)一步可以使該技術(shù)是讓函數(shù)來(lái)告訴有多大的緩沖區(qū)需要被調(diào)用者。當(dāng)輸入指針為空指針,則該函數(shù)可以返回多少字節(jié)調(diào)用者需要提供。調(diào)用者將調(diào)用該函數(shù)兩次。 你并不需要從頭推導(dǎo)出你的API。使用已經(jīng)加工的API作為示例如何暴露自己。
3. 結(jié)合利齒和Lars D的答案;不widestrings已經(jīng)透過(guò)窗戶和BSTR分配呢?
4. 使用Windows API來(lái)分配到PChar類型指針指向。然后,用VB應(yīng)用程序可以釋放使用Windows API了。
5. 我會(huì)說(shuō),誰(shuí)分配也必須釋放它在這種情況下。你會(huì)遇到的問題與其他方案。因此,最安全和清潔的方法是:該DLL(它知道多少),并返回PChar類型調(diào)用者 在調(diào)用者用它做,它調(diào)用FreePointer回該DLL DLL釋放在FreePointer導(dǎo)出函數(shù)該設(shè)置會(huì)是這樣:
unit DLL;interfaceuses SysUtils;function Execute(const Params: PChar): PChar; stdcall;procedure FreePointer(const P: PChar); stdcall;exports Execute;exports FreePointer;implementationfunction Execute(const Params: PChar): PChar; stdcall;var Size: Cardinal;begin Size := Calculate the size; GetMem(Result, Size); ...do something to fill the bufferend;procedure FreePointer(const P: PChar); stdcall;begin FreeMem(P);end;end.

6. 我不熟悉Delphi的,但這里有兩個(gè)主要的字符串與非COM DLL和VB6的選項(xiàng)。 選項(xiàng)1。使用“ANSI”字符串。
'DLL routine expecting to be passed pointers to ANSI strings ''VB6 will allocate and deallocate the strings ''Its vital that VB6 allocates sufficient space for the return string 'Declare Sub MyProc Lib "mylib.dll" (ByVal Param As String, _  ByVal OutVal As String) Function DoMyProc(ByVal Param As String) As String Dim sResult As String sResult = Space$(255) ' create 255 bytes of space for the return string ' Call MyProc(Param, sResult)  DoMyProc = sResultEnd Function
第二個(gè)選項(xiàng)。使用的BSTR。
'DLL routine expecting to be passed two BSTRs. It will modify the second one. ''VB6 "owns" both BSTRs and will deallocate them when it has finished with them. 'Declare Sub MyProc(ByVal lpParam As Long, ByVal lpOutVal As Long)Function DoMyProc(ByVal Param As String) As String Dim sResult As String Call MyProc(StrPtr(Param), StrPtr(sResult))  DoMyProc = sResultEnd Function
我還建議尋找在編寫C的DLL被從VB調(diào)用了微軟的建議。最初發(fā)布與VB5,但仍適用于VB6的。
7. 你不能返回一個(gè)PChar類型作為函數(shù)的結(jié)果,但你可以通過(guò)一個(gè)額外的PChar類型并復(fù)制你想要回到這一PChar類型的字符串。請(qǐng)注意,它傳遞給DLL之前的VB必須分配該字符串到所需的大小。此外,在VB中必須聲明為BYVAL參數(shù)為字符串,它必須為ByVal傳遞:
 param = "aaaaaaaaaaaaaaaaaaaa" ' reserve 20 characters call myproc(byval param)
在調(diào)用的額外BYVAL會(huì)做一個(gè)VB字符串轉(zhuǎn)換為PChar類型和背部的mojo。 (我希望這是正確的,它已經(jīng)一段時(shí)間,因?yàn)槲沂潜黄鹊腣B。)
本文標(biāo)題 :我怎樣才能返回一個(gè)PChar類型從DLL函數(shù)的VB6應(yīng)用程序,而不用擔(dān)心崩潰或內(nèi)存泄漏?
本文地址 :CodeGo.net/97743/
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
如何使用 Unicode 版和 Ansi 版 API – 中文
VFB寫DLL給VB調(diào)用
VB調(diào)用C編寫的DLL的分析
DLL中不能使用STRING的問題
VB對(duì)光驅(qū)的控制
VB解壓縮帶密碼RAR文件的兩者方法
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服