導航:首頁 > 編程語言 > phpvbdll文件

phpvbdll文件

發布時間:2022-08-03 03:04:08

php調用dll文件裡面的函數

1、首先從www.php.net網站上下載php源碼,此處以php-5.2.17版本為例,下載後解壓至E:盤根目錄下(目錄可以自己隨意定)。
2、下載安裝VC++ 6.0,因為PHP源碼是利用6.0版本寫的,所以使用這個版本編譯不會出現意外,別的版本未測試。
3、把VC++ 6.0安裝目錄中的 Microsoft Visual Studio\Common\MSDev98\Bin 絕對路徑添加到系統環境變數中。
4、進入E:\php-5.2.17\ext目錄,復制skeleton文件夾,並重命名為要開發擴展的名字,本例為「myfun」。
5、重命名skeleton.c為myfun.c,skeleton.dsp為myfun.dsp
6、編輯myfun目錄中的php_skeleton.h、myfun.c、myfun.dsp這三個文件,替換內容中所有extname為myfun,EXTNAME為MYFUN。(一定要嚴格區分大小寫)
下面就進入到編碼階段:
7、打開php_skeleton.h文件(頭文件),找到PHP_FUNCTION(confirm_myfun_compiled);,在 PHP_FUNCTION(confirm_myfun_compiled);,下面編寫PHP_FUNCTION(mb_MessageBox);,聲 明一個mb_MessageBox函數,此函數的作用僅是輸出js彈出一個alert消息框,用於測試。
8、下面定義函數入口,打開myfun.c文件,找到PHP_FE(confirm_myfun_compiled,NULL) ;,在下面編寫 PHP_FE(mb_MessageBox,NULL),此處注意一下,PHP_FE是定義的一個宏,所以後面不用加引號。
9、在myfun.c最後面編寫函數的實體部分:

PHP_FUNCTION(mb_MessageBox)
{
char *arg = NULL;
int arg_len, len;
char *strg;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
return;
}

len = spprintf(&strg, 0, "<script>alert('%s')</script>",arg); //此處正是輸入的js代碼
RETURN_STRINGL(strg, len, 0);
}

到這代碼書寫就完成了,下面開始編譯:
10、開始->運行,輸入CMD,打開命令行窗口。
11、進入myfun的目錄,輸入 msdev myfun.dsp /MAKE "myfun - Win32 Release_TS",回車編譯。
12、如果沒有錯誤,在E:\php-5.2.17下會生成一個Release_TS文件夾,在裡面就可以找到php_myfun.dll文件。
至此擴展dll開發完成,下面在php中進行測試:
13、把php_myfun.dll復制到原php目錄中的ext文件夾內。
14、打開php.ini文件,添加當前dll的擴展 extension=php_myfun.dll
15、重啟apache,在網站目錄下新建一文件,輸入以下內容:
<?php
echo mb_MessageBox("測試PHP擴展DLL by 馬犇");
?>
瀏覽即可看到效果

⑵ PHP引用DLL裡面的引用型參數類型的函數(dll是用VB做的)

如果你在PHP中這樣使用,達不到在VB中」傳引用「的效果,

也許你這個可以很簡單的改一下DLL代碼,實現你的目的。

因為你只是想」改一個變數的值「,目前還是用的Sub,這很好辦:

①把Sub 改為 Function ,把它的返回它的返回值賦值給c。

PublicFunctionprintfMin(ByValvalueLightAsInteger,_
ByValvalueUpAsInteger,_
ByValvalueLightAndUpAsInteger,_
ByRefvalueMinAsInteger)AsInteger
IfvalueLight<=valueUpThen
IfvalueLight<=valueLightAndUpThen
valueMin=valueLight
ElseIfvalueLight>valueLightAndUpThen
valueMin=valueLightAndUp
EndIf
Else
IfvalueUp<=valueLightAndUpThen
valueMin=valueUp
ElseIfvalueUp>valueLightAndUpThen
valueMin=valueLightAndUp
EndIf
EndIf
printfMin=valueMin'加上這句
EndFunction

這樣改了,還不影響原VB代碼對這個的使用。

②PHP的改為(我不會PHP,照著你的代碼寫的,如果有錯,你自己修正吧^_^)

$c = 6;

$c = $word->printfMin(1,2,3,&$c);

不知道正確不,只要你能理解我的意思就行。

就是把調用printfMin後的返回值,再賦值給c。

⑶ PHP如何調用.dll文件呀

如果你確定你的擴展*.dll能在php
正確使用的話,首先需要把這個.dll文件復制到php的安裝目錄\ext文件夾下,然後修改php.ini文件,在
;;;;;;;;;;;;;;;;;;;;;;
;
Dynamic
Extensions
;
;;;;;;;;;;;;;;;;;;;;;;
配置節上,按照格式extension
=
a.dll添加該dll文件的引用,然後重新啟動承載php的web伺服器即可。

⑷ php添加擴展dll文件

你這個dll是你自己編譯出來的還是網上下載的?請確保和你當前的php版本相符,然後放到ext目錄,打開php.ini加上一句extension=xx.dll,最後重啟Apache···然後看看你的phpinfo有沒有相應的信息

⑸ VB怎麼調用DLL文件 這個DLL文件是自己用VB寫的放在主程序一個文件夾裡面的,網上找了很多辦法都不行。

網上 的一篇文章,看完應該對你有所幫助

再談在VB中調用VC++開發的DLL
作者:未知 來源:月光軟體站
近日開發一個程序,用到動態鏈接庫,在VB中調用時遇到了一些問題。我查了一些資料,也看了一下CSDN上的文章,感覺這些文章對在VB中調用VC++開發的DLL這一問題闡述得不夠詳細。因此在我的問題得到解決之餘,特為初接觸DLL的朋友們寫下這篇文章。

本文中關於調用約 定的解決方法,也適用於解決其它編程語言之間DLL調用的兼容問題。

①關於DLL的創建與調用

使用VC++的向導即可。具體操作如下:打開菜單「File\New」→選擇「Projects\Win32 Dynamic-Link Library」→選擇「A simple DLL project」即可。這時系統會自動生成3個文件:*.cpp,stdafx.cpp,stdafx.h。

之後將入口函數DLLMain()補充完整,再添加你自定義的函數的代碼。如果你自定義的函數很多,可以將這些函數的聲明部分統一寫入一個頭文件中。再在.cpp文件首部用「# include」語句引入這個頭文件。注意函數聲明前要加上「__declspec(dllexport)」。

(如果你建DLL時選擇的是第三種類型(加入示例代碼),則在函數聲明及定義前都要加上系統定義的宏「*_API」。)

在VB中用如下語句聲明:「Declare Function 函數名 Lib "完整路徑\文件名.dll" [Alias "函數別名"] (ByVal 變數1 As 類型1, ByVal 變數2 As 類型2,…) As 類型3」,與調用API函數類似。

注意:若在窗體代碼的「通用」部分使用,「Declare」前要加「Private」;若在Moudle中使用,「Declare」前要加「Public」。若將DLL文件放在「\Windows\System」或「\WinNT\System32」 目錄下,「Lib」後只寫出DLL主文件名即可。

具體的實例代碼見④(修正後的,可直接運行)。

②關於入口點

如上編寫Cipher.dll,運行,出現錯誤信息「找不到DLL入口點(Error 53)」。出現這一錯誤的原因是C++編譯器在編譯時對函數名Encrypt作了修改。打開快速查看程序(D:\WINNT\System32\Viewers\QuikView.exe),將Cipher.dll拖入查看窗口,找到欄位「?Encrypt@@YAHHH@Z」,發現函數名被加了 一串字元。

解決方法有二。第一,直接在VB聲明中將「?Encrypt@@Y AHHH@Z」作為別名放在「Alias」後即可;第二,在Cipher.dll代碼中在語句「__declspec(dllexport) int __stdcall Encrypt(int p, int k); 」前加上「extern "C" 」,編譯後,用QuikView查看,函數名變為「_Encrypt」,之後再在VB聲明中做相應調整即可。

(對於使用宏的DLL,在「#define」語句中,對宏「Cipher_API」的替換值做更改即可。)

進行了③的更改後,程序又找不到入口點了。再用QuikVie w查看,發現函數名變為「_Encrypt@8」。還有解決方法。在Cipher.dll工程中添加一個文本文件,命名為「Cipher.def」,添加代碼如④。編譯後再用QuikView查看,函數名變回「Encrypt」,在VB中調用,運行正常。

③關於調用約定

採用②中第二種解決方法,運行,出現錯誤信息「DLL調用約定錯誤(Error 49)」。原因是調用約定共有4種方式:__fastcall、__pascal、__stdcall、__cdecl,VC++默認調用方式為__cdecl,而VB默認調用方式則為__stdcall。解決方法是,更改代碼如下(限定調用方式):

extern 「C」 __declspec(dllexport) int __stdcall Encrypt(int p, int k);

…………

int __stdcall Encrypt(int p, int k)

{

int c = p+k;

return c;

}

④源代碼

Cipher.dll:

Cipher.cpp:

//引入預編譯頭文件

#include 「stdafx.h」

//聲明我的函數

extern 「C」 __declspec(dllexport) int __stdcall Encrypt( int p, int k );

//DLL入口函數

BOOL APIENTRY DllMain( HANDLE hMole,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch( ul_reason_for_call )

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

//我的函數

int __stdcall Encrypt ( int p, int k )

{

int c = p + k ;

return c ;

}

Cipher.def:

LIBRARY Cipher

EXPORTS Encrypt

編譯後,將Cipher.dll復制到「D:\WINNT\System32」目錄。

在VB中調用:

Option Explicit

Private Declare Function Encrypt Lib 「Cipher」 _

(ByVal p As Long, ByVal k As Long) As Long

Private Sub Form_Load()

Dim c As Long

c = Encrypt(24, 8)

Text1.Text = c

⑹ PHP可以使用VB把他的核心代碼封裝成DLL嘛

PHP使用VB封裝成DLL?沒有試過。

不過,Zend Corporation (http://www.zend.net)
開發的產品 Zend Studio 可以裝PHP進行編譯,編譯過的PHP運行速度比不編譯的要快。而且,因為編譯後生成的是二進制文件,所以,Zend Studio 也就達到了為PHP加密的功能(雖然國內已經有人開發了一種能對被Zend Studio某些版本編譯過的PHP進行反編譯,從而得到源代碼)。Zend Studio並不是免費的。

經過編譯後的PHP程序不能夠再運行,你的伺服器上必須裝有Zend 公司的另一免費產品:Zend Optimizer。使用Zend Optimizer 後,就可以在你的伺服器上正常運行編譯過的PHP程序了。

⑺ 用VB編寫的ACTIVEX DLL,asp頁面調用時是正常,php調用結果不對

那是因為php和asp還有vb裡面字元串的格式不同
vb的字元串是個BSTR結構,asp應該也是,但php的字元串有它自己的結構
所以你把php的字元串傳給vb的dll會出問題, 就像在vc裡面把字元串傳給vb的dll不處理的話也會出問題(要先轉成bstr才行)

php轉bstr很難……幾乎實現不了。如果你非要這么用,那你要改一下你那個組件里的函數:
傳遞進來的參數你要按照php的字元串格式來解析,並且返回也要返回php的字元串。php字元串的格式可以去zend的官方網站上面找找,做php擴展裡面有介紹。另外你可以在你那個函數里再加一個32位數字型參數(long),表示傳進來的asp還是php的字元串,分別對待

⑻ php里使用DLL內的方法

http://www.php.net/manual/zh/faq.com.php
官方文檔都說了,不行的哦。

另外DLL的WebService,那應該是C# or VB .net的吧,既然是webservices,那你可以嘗試通過http方式和這個WebService交換數據吧。(簡單的說就是2個不同的網站通過http交換數據,就像哪種採集程序、或者web api,如:sina api,微信api)

閱讀全文

與phpvbdll文件相關的資料

熱點內容
gz壓縮文件夾 瀏覽:177
字母h從右往左跑的c語言編程 瀏覽:127
安卓手機如何擁有蘋果手機橫條 瀏覽:765
業余編程語言哪個好學 瀏覽:137
按照文件夾分個壓縮 瀏覽:104
航空工業出版社單片機原理及應用 瀏覽:758
如何在電信app上綁定親情號 瀏覽:376
安卓的怎麼用原相機拍月亮 瀏覽:805
配音秀為什麼顯示伺服器去配音了 瀏覽:755
c盤清理壓縮舊文件 瀏覽:325
app怎麼交付 瀏覽:343
圖蟲app怎麼才能轉到金幣 瀏覽:175
如何做徵文app 瀏覽:446
用什麼app管理斐訊 瀏覽:169
安卓如何下載寶可夢劍盾 瀏覽:166
編譯器開發屬於哪個方向 瀏覽:940
megawin單片機 瀏覽:687
以色列加密貨幣監督 瀏覽:909
程序員前端現在怎麼樣 瀏覽:499
伺服器和介面地址ping不通 瀏覽:557