По сути, у меня есть такая структура:
Приложение PHP -> Расширение PHP (на C ++) -> Библиотека DLL (C ++)
Библиотека DLL вызывает функции внутри себя, например
int Library::FunctionA(){
return Library::FunctionB + 4;
}
Проблема в том, что когда я пытаюсь вызвать Library :: Function A из моего расширения PHP, происходит сбой 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: использование пространства имен 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);
}
Точка, в которой происходит сбой приложения, находится в библиотеке dll при вызове GetOffset (FileName, pmd_variant_name_table) ;.Я ссылаюсь на функции неправильно или что-то в этом роде, или DLL не может вызывать функции внутри себя?
Если это все еще не очень понятно, скажите, что не так!Есть идеи?