Поскольку у вас нет источника для DLL, вам нужно немного проявить творческий подход к вещам на C. Даже если ShortString указан как результат функции, на самом деле вызывающая сторона несет ответственность за предоставление места для размещения результата. Поскольку это функция stdcall, параметры передаются справа налево, что означает, что адрес результата ShortString передается последним. Чтобы выстроить это в ряд, потребуется первый параметр в списке. Я сделаю первый API, GetCPUID. В Си это может выглядеть примерно так:
typedef struct ShortString {
char len;
char data[255];
};
typedef void (_stdcall *GETCPUID)(struct ShortString *result, BYTE cpuCore);
GETCPUID pGetSerial;
HMODULE hWtsLib = LoadLibrary("HardwareIDExtractor.dll");
if (hWtsLib) {
ShortString serial;
pGetSerial = (GETCPUID)GetProcAddress(hWtsLib, "GetCPUID");
pGetSerial(&serial, '1');
char *str = malloc(serial.len + 1); // include space for the trailing \0
strlcpy(str, serial.data, serial.len);
str[serial.len] = '\0'; // drop in the trailing null
}
Я оставлю GetPartitionID в качестве упражнения для читателя: -).