#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 мог ссылаться на него.