基本上我所拥有的是这种结构:
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无法在其自身内部调用函数?
如果这仍然不是很清楚请说什么不是! 有什么想法吗?