Есть длл (не моя), в ней 3 функции 1) ??0FCanvasUtil@@QAE@PAVFRenderTarget@@PAVFRenderInterface@@@Z public: __thiscall FCanvasUtil::FCanvasUtil(class FRenderTarget *, class FRenderInterface *) 2) ?DrawLine@FCanvasUtil@@QAEXMMMMVFColor@@H@Z public: void __thiscall FCanvasUtil:rawLine(float, float, float, float, class FColor, int) 3) ??1FCanvasUtil@@UAE@XZ public: virtual __thiscall FCanvasUtil::~FCanvasUtil(void) Какие параметры им передавать и где их взять я знаю. Хочу написать прогу на ЯВУ типа Си, чтобы эти функции вызывать. Это реально?
GoldFinch Класс надо также объявить внешним, компилер взять такой же, и в теории можно уже и вызывать.
судя по "FCanvasUtil(class FRenderTarget *, class FRenderInterface *)" итп - Си не хватит. А если С++, то надо делать как сказал Osen. з.ы. у Агнера Фогу была статейка, где описывались манглинг имен разными компиляторами, думаю тебе пригодится. Сайт вроде http://agner.org/
важно правильно передать параметры (включая this если он ипользуется). Очень гибок тут ватком (#pragma aux ...), кроме того, ватком линкер позволяет задавать алиасы имен в объектниках.
GoldFinch ну и вчем трабла ? Указатель на класс создал и какой нить в длл одну экспортируемую GetClassPtr и в клиентском коде импортируй и вызывай. результат в переменную-указатель на этот класс и дергай себе на здоровье. Пример мыслей, на псевдо-коде: Код (Text): // декларация class MyClass { /// дохера всего }; MyClass mycl; // глобальная MyClass * GetClassPtr() { return(&mycl); } клиентский код: // декларация class MyClass { /// дохера всего }; MyClass * mycl; // глобальная mycl = GetClassPtr(); mycl.SuperFunc();
1) GetProcAddress 2) def файл с псевдонимами. 3) Править таблицу экспорта. Очень желательно иметь заголовок класса, так как в начале идёт выделение памяти, а затем вызов конструктора из dll. Хотя можно и наугад конечно выделять. GoldFinch Это откуда? Canvas EvilsInterrupt Чтобы это сработало нужно объявить все функции виртуальными или иметь реализацию класса.
С импортом разобрался, надо было объявить соответствующий класс согласно деманглингу, т.е. Код (Text): #pragma comment(lib,"engine.lib") class FCanvasUtil { public: FCanvasUtil(class FRenderTarget *, class FRenderInterface *); public: void DrawLine(float a0, float a1, float a2, float a3, class FColor, int a5); public: virtual ~FCanvasUtil(void); }; class FColor {}; class FRenderTarget {}; class FRenderInterface {}; Всем спасибо.