Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];

Вниз

Передача данных(массива) через 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.041 c
2-1170504882
SveTT
2007-02-03 15:14
2007.02.25
Повтор значений - ошибка


4-1160804337
dreamse
2006-10-14 09:38
2007.02.25
SafeMode


15-1170235098
RustamK
2007-01-31 12:18
2007.02.25
Трансляция ТВ


2-1170393137
delphim
2007-02-02 08:12
2007.02.25
графический компонент RSCharts


15-1170440145
_uw_
2007-02-02 21:15
2007.02.25
О Картинках





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский