есть компонент. у него есть фунция void GetData(..., float * massiv), которая заполняет этот massiv. так написано и в описании, и в работающей программе, сделаной в VS 2003. я пишу программу в 2005-ой, и вместо float* она требует float% — соответсвенно ошибка — нельзя преобразовать типы. как я понял из MSDN, % — это ещё одна модная ссылка. вопрос: как всё-таки организовать выполнение функции GetData? ибо у меня преобразовать типы не получилось.
Здравствуйте, Kaukko, Вы писали:
K>есть компонент. у него есть фунция void GetData(..., float * massiv), которая заполняет этот massiv. так написано и в описании, и в работающей программе, сделаной в VS 2003. я пишу программу в 2005-ой, и вместо float* она требует float% — соответсвенно ошибка — нельзя преобразовать типы. как я понял из MSDN, % — это ещё одна модная ссылка. вопрос: как всё-таки организовать выполнение функции GetData? ибо у меня преобразовать типы не получилось.
Если речь идет о pure c++, то никаких операторов "%- модных ссылок" в нем нет И соответственно необходимости в изменении кода при переносе от VS 2003 к 2005 нет.
Здравствуйте, dip_2000, Вы писали:
_>Если речь идет о pure c++, то никаких операторов "%- модных ссылок" в нем нет И соответственно необходимости в изменении кода при переносе от VS 2003 к 2005 нет.
ну и как тогда сделать так, чтоб был "pure c++"? не хочу всё переделывать в 2003-ей студии...
Здравствуйте, dip_2000, Вы писали:
_>В настройках проекта. Вместо CLR выбрать, что то более "классическое" MFC там, или Win32
в настройках нашел только
configuration properties -> general -> common language runtime support ->...
перебрал все варианты (No support, /clr:pure, /clr:oldSyntax, /clr:safe) — или та же ошибка, или их ещё больше
K>в настройках нашел только K>configuration properties -> general -> common language runtime support ->... K>перебрал все варианты (No support, /clr:pure, /clr:oldSyntax, /clr:safe) — или та же ошибка, или их ещё больше
Вы наверное изначально создавали проект как CLR ? Вам нужен чистый с++(что бы не заморачиваться с % )
Здравствуйте, dip_2000, Вы писали:
_>Вы наверное изначально создавали проект как CLR ? Вам нужен чистый с++(что бы не заморачиваться с % )
Видимо, придётся всё же заморачиваться. Т.к. при добавлении в пустой проект Windows Form студия говорит, что если добавляется CRL компонент, то проект конвертируестя в CRL...
Прошу прощения, кодировка сбилась
K>Видимо, придётся всё же заморачиваться. Т.к. при добавлении в пустой проект Windows Form студия говорит, что если добавляется CRL компонент, то проект конвертируестя в CRL...
K>и так, ещё раз вопрос: что делать с "%"?
Одно из двух: или работать в С++ и не использовать Windows Forms, или использовать Windows Forms и работать в С++/CLR.
С++ и С++/CLR -- совершенно разные языки, по чистой случайности имеющие похожие имена и синтаксис
Здравствуйте, TheBeard, Вы писали:
K>>Видимо, придётся всё же заморачиваться. Т.к. при добавлении в пустой проект Windows Form студия говорит, что если добавляется CRL компонент, то проект конвертируестя в CRL... K>>и так, ещё раз вопрос: что делать с "%"? TB>Одно из двух: или работать в С++ и не использовать Windows Forms, или использовать Windows Forms и работать в С++/CLR.
Не скажите, Framework Class Library и чистый C++ могут ужиться в одно проетке очень даже успешно.
Из вопроса непонятно, GetData — это чья функция? Это метод компонента .net? Это метод класса C++? Это метод COM-интерфейса?
SS>Из вопроса непонятно, GetData — это чья функция? Это метод компонента .net? Это метод класса C++? Это метод COM-интерфейса?
Из вопроса вообще мало что понятно. Судя по сигнатуре функции, она на С++ (там указатель на float). Соответственно, вызывать ее из managed кода проблематично, придется объявлять код unsafe.
SS>>Из вопроса непонятно, GetData — это чья функция? Это метод компонента .net? Это метод класса C++? Это метод COM-интерфейса?
TB>Из вопроса вообще мало что понятно. Судя по сигнатуре функции, она на С++ (там указатель на float). Соответственно, вызывать ее из managed кода проблематично, придется объявлять код unsafe.
GetData — метод неповторимого и важнейшего в программе ActiveX компонента. организовать выполнения метода без ругательств компилятора удалось объявляя в качестве последнего аргумента или нулевой элемент массива, или *<имя массива>. но ни при одном из них программа не работает. так что у меня творческий кризис — этот компонент я переписать не в состоянии и разобраться в нём тоже.
придётся всё переделывать в MFC, с которым, кстати, возникли трудности — нету привычных методов и параметров. даже не знаю как сделать кнопку невидимой, ибо поля Visible не нахожу. посоветуйте нормальную книжку по mfc плз.
K>GetData — метод неповторимого и важнейшего в программе ActiveX компонента.
Для ActiveX-контрлов как и для других COM-компонентов должны без проблем генерироваться .net-обёртки при условии, что компоненты соотвествую спецификации COM. Вероятно, GetData() ей не соответствует. Раз уж вы всё-равно пишете на C++/CLI, то проще всего воспользоваться основной фичей языка: возможно легко смешивать управляемый и неуправляемый код. Предлагаю рабоатать с вашим ActiveX-объектом с помощью тех же средств C++, которыми вы пользовались раньше, а всё остальное писать в виде управляемого кода. Для примера сделал тестовый проект C++/CLR/Windows Forms Application, бросил на форму контрол "SVGActiveX 3.0" и кнопку с таким onclick-ом:
System::IntPtr unk = Marshal::GetIUnknownForObject(axSVGCtl1->GetOcx()); // берём указатель на IUnknown
CComQIPtr<ISVGControl> svgCtrl(static_cast<IUnknown*>(unk.ToPointer())); // получаем ATL-ный CComQIPtr, указывающий на наш контрол
Marshal::Release(unk); // релизим ссылку, неявно добавленную в GetIUnknownForObject
// дальше работаем с svgCtrl старыми добрыми средствами C++, без каких-либо %-ссылок
svgCtrl->setDefaultFontSize(4.0);
TCHAR buf[MAX_PATH];
GetModuleFileName(NULL,buf,MAX_PATH);
_tcscpy(PathFindFileName(buf), TEXT("1.svg"));
svgCtrl->put_SRC(CComBSTR(buf));
В начале файла Form1.h:
#include"NPSVG3_h.h"// заколовочный файл с COM-интерфейсами, предварительно сгенерированный с помощью midl. У вас тоже по-идее должен быть такой для вышего компонента.#include <atlbase.h> // ATL#include <atlcom.h> // ATL
Могу прислать весь тестовый проект, если интересно.
Здравствуйте, Kaukko, Вы писали:
K>Здравствуйте, SuhanovSergey, Вы писали:
SS>>Могу прислать весь тестовый проект, если интересно.
K>да пожалуйста пришлите весь проект
сделал всё так же, как написал SuhanovSergey.
создал файлик *_h.h, вместе с ним создался *_i.c,
для того, что бы он компилился пришлось добавлять в командную строку /Tp *_i.c, но возникает ошибка
C2857: '#include' statement specified with the /Ycstdafx.h command-line option was not found in the source file "*_i.c"
что за?
если эти файлы удалить из проекта и просто подключить библиотеки atlbase и atlcom, то выдается ошибка
An unhandled exception of type 'System.TypeInitializationException' occurred in Unknown Module.
Additional information: The type initializer for '<Module>' threw an exception.
как с этим бороться?
Здравствуйте, Kaukko, Вы писали:
K>сделал всё так же, как написал SuhanovSergey. K>создал файлик *_h.h, вместе с ним создался *_i.c, K>для того, что бы он компилился пришлось добавлять в командную строку /Tp *_i.c, но возникает ошибка K>C2857: '#include' statement specified with the /Ycstdafx.h command-line option was not found in the source file "*_i.c" K>что за?
Надо откючить precompiled headers для этого файла.
K>если эти файлы удалить из проекта и просто подключить библиотеки atlbase и atlcom, то выдается ошибка K>An unhandled exception of type 'System.TypeInitializationException' occurred in Unknown Module. K>Additional information: The type initializer for '<Module>' threw an exception. K>как с этим бороться?
Это известная проблема CLR/ATL приложений. Причина: не инициализируется C-runtime потому что в проекте нет WinMain. Лечение: очищается опция Linker->Advanced->Entry Point, после этого вручную пишется функция WinMain
int __stdcall WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
return main(nullptr);
}
Имеет смысл переименовать и использовать мой тестовый проект.
Здравствуйте, Kaukko, Вы писали:
K>всё исправил, всё сделал... K>но лучше не стало... всё так же вылетает/зависает c Access Violation на той же строчке c GetData(...)
Ну не знаю тогда. Если приложение компилится и запускается, то у вас есть все возможности воспроизвести то окружение, в котором компонент работал в MFC приложении. Посмотрите внимательнее отличия старого кода от нового.