从PHP DLL访问DLL函数

时间:2012-01-24 21:26:56

标签: php c++ dll php-extension

基本上我所拥有的是这种结构:

PHP应用程序 - > PHP扩展(在C ++中) - > DLL库(C ++)

DLL库调用自身内部的函数,例如

int Library::FunctionA(){
       return Library::FunctionB + 4;
}

问题是,当我尝试从我的PHP扩展中调用Library :: Function A时,php崩溃了。我想这是因为php无法调用DLL库中的函数(它不能从库中调用Library :: FunctionB)因此崩溃了?

DLL库的源代码是:

using namespace std;

namespace PMDInfo
{
class PMDParser
{
public:
    static __declspec(dllexport) string GetVariants(string FileName);
    static __declspec(dllexport) streamoff GetOffset(string FileName,streamoff offset);
};
}
 namespace PMDInfo {
       streamoff PMDParser::GetOffset(string FileName,streamoff offset){
            ifstream file2(FileName.c_str(), ios::binary);
            file2.seekg(offset);
         return (streamoff)file2.get();
   }

    string PMDParser::GetVariants(string FileName){
                    char *buffer1[40];
        ifstream ReadPMD(FileName.c_str(), ios::binary);
        streamoff begin = GetOffset(FileName,pmd_variant_name_table);       offsets
        streamoff end   = PMDInfo::PMDParser::GetOffset(FileName,pmd_group_table);
        return itoa(begin-end,buffer1,10);
    }
}

php扩展的源代码:     使用namespace std;

namespace PMDInfo
{
class PMDParser
{
public:
    static __declspec(dllimport) string GetVariants(string FileName);
    static __declspec(dllimport) streamoff GetOffset(string FileName,streamoff offset);
};
}

--- PHP EXTENSION initiation code in here, all works fine ---

ZEND_FUNCTION(GetVariants)
{   

int title_len;
char *title = "";

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &title, &title_len) == FAILURE) {
    RETURN_NULL();
}
RETURN_STRING(PMDInfo::PMDParser::GetVariants(title).c_str(),1);

}

在调用GetOffset(FileName,pmd_variant_name_table);时,应用程序崩溃的位置在dll库中。我是在引用函数错误还是其他东西,或者DLL无法在其自身内部调用函数?

如果这仍然不是很清楚请说什么不是! 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用Swig?它是一个预处理器之类的工具,用于创建从其他语言调用C ++(或C)代码所需的一切,例如: PHP,Perl等。您只需提供一个标题,其中包含您想要访问的符号,它将创建包装代码以编译库以及目标语言中的接口代码。可以找到更多详细信息和示例代码here