Доступ к функции DLL из PHP DLL - PullRequest
0 голосов
/ 25 января 2012

По сути, у меня есть такая структура:

Приложение 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 не может вызывать функции внутри себя?

Если это все еще не очень понятно, скажите, что не так!Есть идеи?

1 Ответ

0 голосов
/ 05 февраля 2012

Вы пробовали использовать Swig ? Это инструмент, подобный препроцессору, для создания всего, что вам нужно для вызова кода C ++ (или C) из других языков, например, PHP, Perl и т. Д. Вам просто нужно предоставить заголовок с символами, которые вы хотите сделать доступными, и он создаст код оболочки для компиляции библиотеки, а также код для интерфейсов на вашем целевом языке. Более подробную информацию и пример кода можно найти здесь .

...