That sounds quite odd that that function would be that slow. I would have thought that constants were buffered internally and only updated to the GPU when next referenced after a change to the data has been recorded (this is how I handle constant buffers in my DX11 plugin), but from what you're saying it sounds like it might be pushing the constant data to the GPU (and thus potentially incurring GPU stalls where it cannot do any other work until this transfer completes) for each vector element update. If this is true that would be a most severe bottleneck indeed.
I could provide array setting functionality for constants in DBPro9Ex when I get the time.
For the record it should be technically possible to call the necessary functions directly from DBPro, using IanM's dll for calling function pointers. If you're interested in this and / or want a weekend programming project the steps would go roughly like so:
1) Call the
GetObjectData() function from DBProBasic3DDebug.dll (you'll need to load it as a dll and use CALL DLL for this) to get a pointer to the raw data structure representing an object that has the target effect set. This is necessary as it appears to be the only (round-about) way to get to the effect pointer from an external source; there is no
GetEffectDataPointer() or similar function exported in any of the core dll's.
2) Now you have to calculate lots of offsets to the individual data members of the sObject structure. You can find details on these in the DarkGDK headers, or the open source version of DBPro (beware that the latter is not 100% compatible with older versions due to changes to the object, as well as other structures brought about due to GameGuru development). Basically you'll want to trace the same path as Fallout used in the DarkGDK post you linked to in your opening post.
3) Once you've located it, the effect pointer points to a COM interface. You'll want to find its vtable - this is simply where the first 4 bytes pointed to by the pointer leads. The address of the
SetVectorArray() function can is number 32 from the top of the zero-based vtable; this is followed by the
GetVectorArray() function at index 33.
4) In order to call these functions you'll need a raw memory buffer. You can for example create a suitably sized memblock to hold all your float values; this will then act as your array. (DBPro's arrays are in fact implemented as a table of lists, which means that the array data is not guaranteed to be contiguous in memory, so you can't use an array pointer directly).
5) Once you have all this set up you can call the functions from the effect interface using IanM's CALL FUNCTION PTR function.
Happy hacking