|
写了个VC调用PHP Sapi 的dll。
功能:
1.在你的vc、.net程序中嵌入PHP代码
2.查看PHP的op-code
用法说明:
LinxPHPEmbedLib.dll导出4个函数:
1.extern "C" __declspec(dllexport) void Test();
说明:测试函数。在cmd下运行"rundll32 LinxPHPEmbedLib.dll,Test >phpinfo.htm",如过看到生成了phpinfo.htm文件,则表示该dll可正常使用。注意不可省略" >phpinfo.htm"
2.extern "C" __declspec(dllexport) char * EvalEx(char *str,int *p_str);
说明:调用php引擎运行str后,返回 call main();的内容。相当于 eval($str);return main();
demo:
int addr=0;
char *code2 = "$a=123;function main(){global $a;return $a;}";
ret = (*p_EvalEx)(code1,&addr);
printf("%s\n",ret); //将会打印123
(*p_Del)(addr);
3.extern "C" __declspec(dllexport) char * GopEx(char *str,int *p_str);
说明:把char *str编译成PHP OP-code,并返回op-code的内容。
4.extern "C" __declspec(dllexport) void Del(int i);
说明:释放dll返回的资源。
下载:
Linx PHP Embed Lib.rar :http://blogimg.chinaunix.net/blog/upfile2/100328230444.rar
演示代码:
typedef char * ( *EvalEx)(char *str,int* addr);
typedef char * ( *GopEx)(char *str,int* addr);
typedef char * ( *Del)(int addr);
EvalEx p_EvalEx;
GopEx p_GopEx;
Del p_Del;
int main(int argc, char* argv[])
{
char *code1 = "echo 'hello,world!';";
char *code2 = "$a=123;function main(){global $a;return $a;}";
char *engineDllPath = "LinxPHPEmbedLib.dll" ;
if (!GetModuleHandleA(engineDllPath))
{
LoadLibraryA(engineDllPath);
}
HMODULE hModule=GetModuleHandleA(engineDllPath);
if (!hModule)
{
printf("no hModule");
return 0;
}
p_EvalEx=(EvalEx)GetProcAddress(hModule,"EvalEx");
p_GopEx=(GopEx)GetProcAddress(hModule,"GopEx");
p_Del=(Del)GetProcAddress(hModule,"Del");
char *ret ;
int addr=0;
ret = (*p_EvalEx)(code1,&addr); //在命令控制台下可以看到输出hello,world!
printf("%s\n",ret); //由于code1没有main函数,返回值为空
(*p_Del)(addr);
ret = (*p_GopEx)(code2,&addr);
printf("%s\n",ret); //得到main()返回"123"
(*p_Del)(addr);
//编译code2
ret = (*p_GopEx)(code2,&addr);
printf("%s\n",ret);
(*p_Del)(addr);
//编译a.php.(tip:如果代码以“file://”开头,GopEx函数会直接编译该文件。记得PHP文件要以“<?php”开头。)
ret = (*p_GopEx)("file://a.php",&addr);
printf("%s\n",ret);
(*p_Del)(addr);
来源:http://hi.baidu.com/linx2008/blo ... 77975df819b88e.html |
|