2015-03-11 3 views
0

Я пытаюсь вызвать DLL Delphi из Excel и вернуть столбец значений вариантов данных. У меня есть dll, возвращающий единственный shortstring, и это появляется в ячейке нормально. Теперь я пытаюсь вернуть столбец переменных значений. Он попадает в мой код в порядке, но массив в excel - все 0.Возвращение массива Excel из Delphi

Любые идеи очень ценятся.

Вот макрос регистрация в Excel: =REGISTER("c:\projects\test\delphixl.dll","GetPolicyData","KDD","GetPolicyData","Co,Pol",1,"Delphi")

Я не уверен, что 1 после параметров; Я не могу найти полную документацию в любом месте.

диапазон в Excel имеет: {=GetPolicyData(C1,D1)}

Ниже приведен код в D7. В соответствии с excel doc для функций регистра это выглядит нормально.

тип K данные

Тип данных К использует указатель на переменном размере структуру FP. Вы должны определить эту структуру в DLL или код ресурса следующим образом:

typedef struct _FP 
{ 
    unsigned short int rows; 
    unsigned short int columns; 
    double array[1];  /* Actually, array[rows][columns] */ 
} FP; 


Type  
    pPolicyData = ^tPolicyData; 
    tPolicyData = Record 
    Rows: word; 
    Cols: word; 
    data: variant; 
    End; 

var 
pd: tPolicyData; 

Function GetPolicyData(co: pShortString; pol: pShortString): pPolicyData; Stdcall; 
Var 
    polc: tpolcmst; 
Begin 
    lpro := tlifepro.create; 
    lpro.opendatabases; 
    polc := tpolcmst.create(lpro); 
    Try 
    polc.read(co^, pol^); 
    pd.Rows := 2; 
    pd.Cols := 1; 
    pd.data := VarArrayCreate([0, 1], varVariant); 
    pd.data[0] := datetostr(polc.issuedate); 
    pd.data[1] := format('%.2f', [polc.modepremium]); 
    result := addr(pd); 
    Finally 
    lpro.closedatabases; 
    freeit(lpro); 
    End; 
End; 
+0

Вы уверены, что хотите больше всего использовать РЕГИСТРАТОР? –

+0

Спасибо, за ваши ответы. Я перечитал документ и понял, что он только удваивает. Итак, теперь я заполняю таблицы SQL и имею их на листе в качестве подключения к данным. Я использую РЕГИСТР, поскольку это единственное, что я могу найти, чтобы вызвать DLL. Если есть другой способ, я все уши. Все это работает, за исключением того, что я не понял, как заставить регистр запускаться при запуске. Я не эксперт VBA, поэтому не понял, как это сделать в макросе автоматического запуска. Опять же, любые советы, принятые с уважением. –

ответ

1

Вы объявили о представлении данных член записи FP (TPolicyData) как Variant. Он должен быть объявлен Двойной, и он должен быть массивом требуемых размеров.

В этом случае, с Строк = 2 и Cols = 1:

TPolicyData = record 
    Rows: word; 
    Cols: word; 
    data: array[0..1] of Double; 
End; 

Если Ряды и Cols динамичны, то вам нужно будет рассчитать размер памяти, необходимый для записи FP и выделить это динамически. Требуемая память будет:

2 bytes for "Rows" word 
+ 2 bytes for "Cols" word 
+ Rows x Cols x 8 bytes for "data" array of Doubles 

С Delphi 7 вам нужно будет использовать смещение указателя в память данных, чтобы присвоить значения для отдельных двойных элементов в «массиве».

Однако, поскольку вы не упомянули о необходимости обращения к переменным строкам и столбцам, я не буду подробно останавливаться на этом, поскольку это может быть излишним.

+0

'pShortString' тоже должен быть неправильным. 'PAnsiChar' конечно. –

+0

@ Давид - Нет. Спецификация типа данных - KDD. то есть «возвращает K (массив) и принимает 2 D параметра». D - это код для строки с байтами длиной в байтах однобайтовых символов. Или, в терминах Delphi: ShortString. т. е. ShortString является ТОЧНО правым. – Deltics

+0

Хорошо, спасибо ..... –

Смежные вопросы