[C] 纯文本查看 复制代码PHP_FUNCTION(EDLL)
{
char *DLL_Name = NULL, *function = NULL, *arg_1 = NULL, *arg_2 = NULL;
int Len[4];
size_t len;
zend_string *strg;
int args = ZEND_NUM_ARGS();
if (args == 1) {
if (zend_parse_parameters(args, "s", &DLL_Name, &Len[0]) == FAILURE) {
return;
}
strg = strpprintf(0, "抱歉,请输入动态链接库 %s 函数名称", DLL_Name);
RETURN_STR(strg);
return;
}
else if (args == 2) {
if (zend_parse_parameters(args, "ss", &DLL_Name, &Len[0], &function, &Len[1]) == FAILURE) {
return;
}
}
else if (args == 3) {
if (zend_parse_parameters(args, "sss", &DLL_Name, &Len[0], &function, &Len[1], &arg_1, &Len[2]) == FAILURE) {
return;
}
}
else {
strg = strpprintf(0, "抱歉,参数输入过多");
RETURN_STR(strg);
return;
}
HMODULE hLoad;
hLoad = LoadLibraryA(DLL_Name);//这里打开第一个参数传进来的DLL名称
if (hLoad == NULL)
{
strg = strpprintf(0, "抱歉,无法载入动态链接库[%s]", DLL_Name);
}
else {
if (args - 2 == 0) {
typedef char *(__stdcall *lpAddFun)(); //没有参数
lpAddFun addFun; //函数指针
addFun = (lpAddFun)GetProcAddress(hLoad, function);//
if (addFun != NULL) {
strg = strpprintf(0, "%s", addFun());
}
else {
strg = strpprintf(0, "无效方法 %s", function);
}
}
else if (args - 2 == 1) {
typedef char *(__stdcall *lpAddFun)(char[]); //一个参数
lpAddFun addFun; //函数指针
addFun = (lpAddFun)GetProcAddress(hLoad, function);
if (addFun != NULL) {
strg = strpprintf(0, "%s", addFun(arg_1));
}
else {
strg = strpprintf(0, "无效方法 %s", function);
}
}
else {
strg = strpprintf(0, "参数错误");
RETURN_STR(strg);
return;
}
}
RETURN_STR(strg);
}