This might be helpfull but not sure as I go the other way with PB calling C++ function with string array. A PB string array is a C++ LPSTR * (pointer to pointer). The PB array and the C++ LPSTR * are the same. PB does not store a null pointer to mark the end of the array so I must pass the arraybound to C++. If going the other way then C++ function#1 would return the array bound and the maximum string length, in PB initialise string array members, then C++ function#2 gets PB string array as argument LPSTR * and can strcpy each local element.