Файл ZScript выполняется в DLL

#c #c #dll #zscript

#c #c #dll #zscript

Вопрос:

В ZScript для ZBrush вы можете вызвать DLL с помощью FileExecute

 [FileExecute,"ZBRUSH_ZDataZPlugsWebZPlug.dll",HTTP_Browse,"http://www.zbrushcentral.com"]
 

Какова сигнатура точки входа DLL (функции C / C ) для получения аргументов и данных из ZScript? Существуют ли какие-либо недокументированные аргументы для маршаллинга структур данных между ZScript и C ?

Ответ №1:

После восстановления некоторой документации, которая частично отвечает на этот вопрос: вот полная FileExecute подпись:

 [FileExecute, Filename, Function to call, Optional text input, Option numeric input, Optional memory block input, Optional memory block output]
 

Вы можете передать блок памяти «MemBlock», созданный в ZScript:

 [FileExecute, "DllName.dll", "FunctionName", "StringArgument", [MemGetSize, "MemBlock"], "MemBlock",]
 

Вот функция C в DLL для приема вызовов из ZScript и блока памяти:

 #define DLLEXPORT __declspec(dllexport)

extern "C" int DLLEXPORT FunctionName(unsigned char* message, double number, void* memblock, void* memblock2)
{
    int mbSize = (int)number; // the second argument has to be a double

    // Read from the memory block via a strstream
    stdstrstream mbStream((char*)memblock, mbSize);

    // Read the first integer written into the memory block by the ZScript
    int val = 0;
    mbStream.read((char*)amp;val, 4);
}
 

extern "C" заключается в том, чтобы заставить функцию C иметь связь ‘C’ (компилятор не искажает имя), чтобы код ZBrush C мог ссылаться на него.