Текущий архив: 2007.02.25;
Скачать: CL | DM;
ВнизПередача данных(массива) через DLL. Найти похожие ветки
← →
acorables © (2007-02-03 02:12) [0]Доброе время суток. Подскажите пожалуйста в такой ситуации:
одна программа (исходника нет, влезть в нее нельзя) пользуется dll (есть шаблон dll), передавая ей данные(массивы) ввиде параметров функций, а мне надо забирать их(данные) в Excel из dll периодически (через 1мин), либо в програмку на Delphi 7. Вообщем как сделать, чтобы dll получив данные от одной программы передала их другой.
Заранее благодарен.
← →
iXT © (2007-02-03 12:07) [1]Программа вызывает какую-то функцию из dll. (Шаблон функции есть). Тебе нодо дописать функцию, что бы она экспортировала данные в Excel.
Кажется я правильно понял или нет? :)
← →
acorables © (2007-02-03 13:58) [2]Да Вы меня правильно поняли.
Я пытался использовать сервер автоматизации Excel, но сложнова-то для меня. Вылезают ошибки, а вывод периодически(через 1мин или чаще) вообще не идет.Может как можно объявить общий массив или переменные, чтобы их было видно и из dll и из Excel или програмки на Delphi 7. Или другой способ.
Заранее благодарен.
← →
iXT © (2007-02-03 15:06) [3]Каждую минуту (или чаще) функция вызывается из программы?
← →
acorables © (2007-02-03 15:40) [4]Да, функция вызывается из программы(для которой нет исходника,нельзя влезть).
← →
acorables © (2007-02-04 14:27) [5]Мастера, откликнитесь, хотя бы скажите в каком направлении идти, способы решения.
← →
acorables © (2007-02-05 13:18) [6]Мастера, откликнитесь, хотя бы скажите в каком направлении идти, способы решения.
Или это очень сложно.
← →
Elen © (2007-02-05 13:28) [7]
> acorables
Ну как сказать. Если ДЛЛ не расчитана на твою задачу то это можно попробовать решить перехватом функции ДЛЛ, Типа делаеш перехват на свою функцию, извлекаеш данные, и вызываеш перехваченную функцию, вставив в нее эти данные...
← →
acorables © (2007-02-05 16:02) [8]Elen, а не подскажете как сделать перехват на свою функцию или где почитать об этом. И я не совсем понял перехват осуществляется внутри dll или это на уровне API Windows. Прошу прощения, если глупый вопрос, я только разбираюсь с этим.
← →
Elen © (2007-02-05 16:11) [9]
> acorables
Да здесь много про перехват писано. Порули поиском. Ну еще можеш поикать статьи Ketmara или MS-Rema (hook_full.chm). Там описаны основы.
← →
Сергей М. © (2007-02-05 16:16) [10]
> я не совсем понял перехват осуществляется внутри dll или
> это на уровне API Windows
Перехватывается IAT вызывающего и EAT вызываемого модулей.
← →
iXT © (2007-02-05 17:26) [11]СТОП!!!!!!
Какой перехват?????
У тебя есть шаблон dll, т.е. функции которую приложение вызывает из длл.
Тебе надо написать dll с этой функцией, а в функцию пишешь все что тебе надо. Тебе же не просто так формат dll-ки оставили?
Или я тебе сказал направление, или ты опять чегой-то не договорил.
← →
acorables © (2007-02-05 17:47) [12]А нельзя ли создать какой-нибудь массивчик, доступный и для dll и какой-нибудь програмки на Delphi.
← →
Сергей М. © (2007-02-06 08:43) [13]
> acorables © (05.02.07 17:47) [12]
Приводи тот самый "шаблон" с подробным описанием
← →
evvcom © (2007-02-06 09:04) [14]> [7] Elen © (05.02.07 13:28)
> это можно попробовать решить перехватом функции ДЛЛ
Человеку сложновато это
> [2] acorables © (03.02.07 13:58)
> Я пытался использовать сервер автоматизации Excel, но сложнова-
> то для меня.
а вы ему про перехват? :)
ИМХО, сервер автоматизации на порядок, а то и более проще.
← →
acorables © (2007-02-06 15:20) [15]Весь шаблон приводить не стал, там куча вспомогательных функций,
по регистрации количества, имен, типов пользовательских функций и
их аргументов. Не привожу и файл структуры типов данных.
Возможно для Вас достаточно и этого фрагмента dll, если нет то выложу
всю, кстати как присоединить файл к сообщению.
Эта вспомогательная функция проверяет корректность значений,
возвращает значение : Double (это и без меня ясно).
function ForceSingleRange (a_lfDbl:Double) : Double;
begin
if (a_lfDbl > 0.0) then
begin
if (a_lfDbl > MaxSingle) then
a_lfDbl := MaxSingle
else
if (a_lfDbl < MinSingle) then
a_lfDbl := MinSingle;
end
else
if (a_lfDbl < 0.0) then
begin
if (a_lfDbl < -MaxSingle) then
a_lfDbl := -MaxSingle
else
if (a_lfDbl > -MinSingle) then
a_lfDbl := -MinSingle;
end;
ForceSingleRange := a_lfDbl;
end;
//Эта функция из которой мне нужно забирать данные.
procedure WeightedMovingAverage (const a_psSrc: PMSXDataInfoRec;
var a_psResult: MSXDataInfoRec;
a_iPeriod : Integer);
var l_iIndex : Integer;
l_iMaxIndex: Integer;
l_lfSum : Double;
l_lfDivisor: Double;
i : Integer;
begin
l_iIndex := a_psSrc.iFirstValid; //нальное значение
l_iMaxIndex := a_psSrc.iLastValid; //конечное значение
l_lfDivisor := ForceSingleRange(a_iPeriod * (a_iPeriod+1.0) / 2.0); // Sum of Digits formula
while ((l_iIndex + a_iPeriod - 1) <= l_iMaxIndex) do
begin
l_lfSum := 0.0;
for i := 0 to a_iPeriod-1 do
l_lfSum := ForceSingleRange(l_lfSum + a_psSrc.pfValue[l_iIndex+i] * (i + 1.0));
//В следующей строке содержаться нужные мне данные, т.е.
//:= ForceSingleRange(l_lfSum / l_lfDivisor) их то и надо передать в Excel.
a_psResult.pfValue[l_iIndex + a_iPeriod - 1] := ForceSingleRange(l_lfSum / l_lfDivisor);
l_iIndex := l_iIndex + 1;
end;
a_psResult.iFirstValid := a_psSrc.iFirstValid + a_iPeriod - 1;
a_psResult.iLastValid := l_iMaxIndex;
end;
Благодарю всех кто со мной здесь возится.
← →
Сергей М. © (2007-02-06 15:29) [16]
> acorables © (06.02.07 15:20) [15]
> исходника нет, влезть в нее нельзя
> достаточно и этого фрагмента dll
Что за лажа ? мол, исходников нет, но вот вам тем не менее фрагмент ?
← →
Elen © (2007-02-06 15:31) [17]
> но вот вам тем не менее фрагмент ?
Видать Декомпилил долго :)
> evvcom © (06.02.07 09:04) [14]
Ну пусть учится.
← →
evvcom © (2007-02-06 15:52) [18]> [15] acorables © (06.02.07 15:20)
До боли знакомый код. Метасток мучаешь. Только там, насколько я помню, ForceSingleRange возвращает Single, а не Double, поскольку Метасток в своих массивах хранит данные в синглах. При написании MSX-dll никаких перехватов не требуется. Попробуй еще раз объяснить, что ты хочешь.
← →
iXT © (2007-02-06 15:56) [19]
> Ну пусть учится.
Правильно, сначала освоим китайскую граммоту, а затем и складывать учиться будем.
> Сергей М. © (06.02.07 15:29) [16]
Исходников нет программы которая вызывает dll
> acorables © (06.02.07 15:20) [15]
Ну и какие теперь у тебя проблемы. Теперь отсюда работаешь с Excel как OLE. Проще работать с txt-файлом, разделяешь скажем <TAB>-ом, и вообще какого к нему привязываться? А если его на машине не будет?
← →
evvcom © (2007-02-06 16:02) [20]> [15] acorables © (06.02.07 15:20)
> //В следующей строке содержаться нужные мне данные
Короче так. Поскольку Securities у тебя может быть масса с различными характеристиками, тебе есть смысл оформить все это в класс. Далее из этой функции в списке искать уже созданный объект. В нем у тебя уже должны быть записаны как последний индекс проанализированного бара, так и OleVariant объекта Excel, WorkSheet, Cell или Range и т.п. для вставки/изменения нужной ячейки. Ну и если объект не найден (новый), то его создать и проинициализировать.
А вообще тебе нужно ли постоянно это дело скидывать в Excel? По-моему удобнее по запросу. Запуздырь в трей :) иконку, и оттуда управляй процессом.
← →
acorables © (2007-02-06 16:27) [21]Благодарю, за помощь, попробую еще поковыряться, если есть еще соображения буду рад.
Прошу прощения за плохо сформулированную задачу.
← →
iXT © (2007-02-06 16:32) [22]
> если есть еще соображения буду рад.
Все соображении уже сказаны, теперь осталась твоя "поковыряюся" (не сочти за оскорбление), т.е. работа.
← →
acorables © (2007-02-06 22:07) [23]
> evvcom © (06.02.07 16:02) [20]
> Далее из этой функции в списке искать уже созданный объект
Поясните пожалуйста в каком списке.
← →
evvcom © (2007-02-07 09:15) [24]> [23] acorables © (06.02.07 22:07)
Поскольку созданных объектов может быть много, их надо где-то хранить (ну в смысле ссылки на них). Для этого можно использовать массивы (arrays) или списки (TList, TObjectList).
Страницы: 1 вся ветка
Текущий архив: 2007.02.25;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.043 c