Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2010, 23:04   #21
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию

Так,написал dll в С#,вот её код:
Код:
using System;

using Mathcad;

namespace Project1
{

	public class Class
	{
		 Mathcad.Application MC;
		 Mathcad.Worksheet WS;
		 Mathcad.Worksheets WK;

		public void Create()
		{
			MC = new Mathcad.Application();
			WK = MC.Worksheets;
		}
		public void Open(string s)
		{
			WS = WK.Open(s);
		}
		public  void Set(double in0)
		{
			 WS.SetValue("in0", in0);
			 WS.Recalculate();
		}
		public  double Get()
		{
			return (WS.GetValue("out0") as NumericValue).Real;
		}
		public  void Quit()
		{
			WS.Close(Mathcad.MCSaveOption.mcDiscardChanges);
			MC.Quit(Mathcad.MCSaveOption.mcDiscardChanges);
			System.Runtime.InteropServices.Marshal.ReleaseComObject(WK);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(WS);
			System.Runtime.InteropServices.Marshal.ReleaseComObject(MC);

		}

	}
}
Пробую эту ддл загрузить из C++
Код:
TForm4 *Form4;
typedef void (*importFunction)();

//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
	: TForm(Owner)
{
	importFunction Create;

	HINSTANCE hinstLib = LoadLibrary("Project1.dll");
	Create = (importFunction)GetProcAddress(hinstLib, "Create()");
	Create();

}
Сделал остановку,HINSTANCE hinstLib = LoadLibrary("Project1.dll"); нормально,адрес не нулевой.А вот Create = (importFunction)GetProcAddress(hins tLib, "Create()"); Create уже с нулевым..Что ж я опять не правильно делаю?..(..Нид хелп!.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 28.02.2010, 23:21   #22
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А Вы точно, в dll, экспортируете ф-цию Create() именно с таким именем?(при чём со скобками)
netrino вне форума Ответить с цитированием
Старый 28.02.2010, 23:57   #23
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию

Цитата:
А Вы точно, в dll, экспортируете ф-цию Create() именно с таким именем?(при чём со скобками)
Я и без скобок пробовал,сейчас переписал немного класс.
Код:
public interface DllInt
{
	 void Create();
	 void Open(string s);
	 void Set(double in0);
	 double Get();
	 void Quit();
}

	public class Class:DllInt
	{//Остальной текст такой же
        }
}
Пробую нечто вроде такого только никак не могу понять откуда они берут
Код:
 #import "....\aName.tlb" raw_interfaces_only
потому как у меня в папке с проектом такого файла нет(ТОЧНО нет)).Вот теперь окончательно запустался что к чему..(
З.Ы. Сделал через cmd .tlb файла теперь он его подключает с ошибкой,думаю дальше.
Не давай организму поблажки, каждый день тренируй его в шашки..

Последний раз редактировалось Скарам; 01.03.2010 в 08:50.
Скарам вне форума Ответить с цитированием
Старый 09.03.2010, 14:38   #24
bobik
 
Регистрация: 23.09.2009
Сообщений: 3
По умолчанию

Скарам, у тебя появился коллега...
Мне тоже нужно передавать(с C++ Builder) в MathCad значения, вести расчет и обратно в прогу получать результат. Вот сегодня попал на эту тему и буду пробовать что-то делать, если получицо - делись и я поделюсь
bobik вне форума Ответить с цитированием
Старый 04.05.2010, 22:22   #25
e-bosh
Пользователь
 
Регистрация: 01.12.2009
Сообщений: 14
По умолчанию

что-нибудь получилось? у меня абсолютно такая же задача - диплом "горит"
e-bosh вне форума Ответить с цитированием
Старый 05.05.2010, 22:59   #26
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию

А что конкретно Вас интересует?...Получилось ли обращаться к Маткаду из своей программы? Да,на С#. Устраивает ли МЕНЯ это достижение? Нет,т.к. программа замедляется в разы,либо Маткад тупит,либо обращение к Маткаду осуществляется слишком долго. В любом случае применять Маткад к любому численному методу (с построением графика и тд) неоправданно.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 06.05.2010, 11:28   #27
e-bosh
Пользователь
 
Регистрация: 01.12.2009
Сообщений: 14
По умолчанию

Понятно, спасибо. Просто у меня есть интерфейс сделанный с C++ Builder 2007 и довольно много листов расчетов маткада (Расчет умножителелей частоты на ДНЗ и транзисторных усилителей с расчетом всех цепей, вплоть до конструктивной реализации). Вот и хотел начальные данные для расчета отправлять с программы в маткад и получать результат обратно.
e-bosh вне форума Ответить с цитированием
Старый 06.05.2010, 21:05   #28
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию

Возможно в Вашей задаче и есть смысл применять маткад,но вот с++ у меня подключить не получилось.Возможно я чего-то не понял или не разобрался. Почитайте посты,которые писал и ссылки посмотрите,что я тут выкладывал,думаю,что все делается просто,только надо понять подход. Если у Вас имеются мысли на сей счет-милости просим,обсудим,поможем.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 06.05.2010, 22:22   #29
e-bosh
Пользователь
 
Регистрация: 01.12.2009
Сообщений: 14
По умолчанию

Значит к чему я пришел. Добавил библиотеку типов через Component->Import Component-> Mathcad 12 Automation API. Подключил файлы Mathcad_TLB.h и Mathcad_OCX.h. Пользуюсь ObjectBrowser'ом изучал свойства, методы и классы маткада. Задачу поставил тривиальную для начала - интерфейс программы 3 окошечка ( два для ввода данных, одно для отображения результата), две кнопки ( расчет и закрытие формы-выход). В маткадовском файле формула k:=a+b k:=.. .В итоге путём проб и ошибок и долгих манипуляций получил следующий код:

#include <vcl.h>
#pragma hdrstop
#include "Mathcad_TLB.h"
#include "Mathcad_OCX.h"
#include <OleCtnrs.hpp>//на каком то форуме увидел, зачем не знаю
#include <ComObj.hpp>// аналогично

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Variant m;
Variant k;
Variant l;
Variant t;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{

m=CreateOleObject("Mathcad.Applicat ion");
//m.OlePropertySet("Visible",(Variant )true); - делал видимым для контроля
k=CreateOleObject("Mathcad.Workshee t");
l=m.OlePropertyGet("Worksheets");
k=l.OleFunction("Open","c:\\Temp\\f ile1.mcd");
float i=StrToFloat(Form1->Edit2->Text);
float j=StrToFloat(Form1->Edit3->Text);
k.OleFunction("SetValue","a",i);
k.OleFunction("SetValue","b",j);
k.OleFunction("Recalculate");
t=k.OleFunction("GetValue","k");
Form1->Edit1->Text=t;
//k.OleFunction("Close",2);
m.OleFunction("CloseAll",2);
m.OleFunction("Quit",2);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Form1->Close();
}
//----------------------------------------------------------------------------


Вообщем то все заработало на ура, как мне показалось сначал Выявились следущие ошибки и непонятки:
1.не могу передать в маткад нецелое число (12.54, 123.25e-4 и т.д.) (отрицательные целые передаются и считаются спокойно). в ручную в маткаде сделал так чтобы результат был нецелым, в программу получил его спокойно.

пошарил в инете, поглядел в других языках, вроде бы используют тип double. Попробовав его применить выскакивать ошибка и с меня требуют указать файл "ComObj.pas". где его брать и что это я не понял.

2.При переносе программы на другую машину, mathcad почему то не хочет закрываться, продолжает висеть в процессах и жрать ресурсы компа после закрытия программы. И через какое время вылазит ошибка
"An unknown runtime error occuried. и маткадовский процесс завершается.
У меня есть подозрения что это из того что стоят разные версии маткада.
На ноуте где писал программу Mathcad 13, на другом компе Mathcad 14.

3.Хотелось бы автоматически указывать месторасположения файла маткада.Дошёл до такой штуки:
TCHAR buffer[MAX_PATH];
GetCurrentDirectory(sizeof(buffer), buffer);
char s*="\\file2.mcd";
strcat(buffer,s)
buffer - содержит путь с указание на файл mcd, но беда в том что он в виде "C:\Temp\file2.mcd", а чтобы использовать его в функции нужен двойной слэш - \\. Которой я не знаю как получить.

Интересно было бы узнать ваше мнение. Спасибо.
e-bosh вне форума Ответить с цитированием
Старый 07.05.2010, 08:25   #30
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию

Не очень понял почему у меня не работало,ибо с Оле я мучился дольше всего...Прям одно расстройство.
Начну с 3-го: Надо написать цикл,который перебирает массив символов,
когда он встречает / в массив записывается ещё один /.А вообще,если Вы берете текущую папку программы,тогда все проще,если вы просто указываете имя файла,то оно ищет в первую очередь в папке,в которой находиться ехе, потом в папке виндовс.
Второе: Тоже такое было,там надо дописать одну команду,сейчас нет времени,потом посмотрю в своем проекте-скажу.
Первое: Тут надо трассировать и смотреть пошагово. Вообще Mathcad сам распознает типы,т.е. когда ему пихают вариант он должен сам подумать какое это число. Вообще попробуй передать ему double,float и получить тоже double,float,если пройдет,тогда проблема с преобразованием из Variant->Double
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MathCad werser Помощь студентам 1 14.12.2009 18:01
MathCAD+интерфейс e-bosh Помощь студентам 0 01.12.2009 17:07
MATHCAD HECTOR.A. Помощь студентам 3 08.03.2009 20:21
MathCad madshizik Microsoft Office Excel 2 10.10.2008 18:36