⑴ 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)