19/08/2013
Загрузка управляемой .NET сборки из ObjectARX приложения
Вопрос:
Как загрузить управляемую .NET сборку из ObjectARX приложения?
Ответ:
Чтобы загрузить управляемую сборку из arx-приложения, вы можете использовать экспортируемую из acdbmgd.dll функцию LoadManagedDll.
Сигнатура её: Acad::ErrorStatus LoadManagedDll(const TCHAR* fname)
Вы должны использовать функцию GetProcAddress, так как мы не обеспечили библиотеку импорта для acmgd.dll:
Код - C++: [Выделить]
- typedef Acad::ErrorStatus (__stdcall* funcPtr)(const TCHAR* fname);
- static void TestMyNetLoad(void)
- {
- ACHAR fileName[MAX_PATH];
- if( RTNORM != acedGetString(true, _T("\nПолный путь к DLL-файлу: "), fileName) )
- {
- acutPrintf(_T("\nЧто-то не то с вводом пути к файлу!"));
- return;
- }
- HMODULE hAcMgd = ::GetModuleHandle(_T("ACDBMGD.DLL"));
- funcPtr pLoadMgd = (funcPtr)::GetProcAddress(hAcMgd, "LoadManagedDll");
- if( pLoadMgd )
- {
- Acad::ErrorStatus es = (*pLoadMgd)(fileName);
- if( es != Acad::eOk )
- {
- acutPrintf(_T("\nОшибка в загрузке .NET DLL!"));
- return;
- }
- }
- else
- {
- acutPrintf(_T("\nОшибка получения указателя функции LoadManagedDll()!"));
- return;
- }
- }
Примечание переводчика:
Можно всё сделать несколько проще, так как в действительности библиотека acdbmgd.lib экспортирует функцию LoadManagedDll:
Код - C++: [Выделить]
- enum Acad::ErrorStatus __stdcall LoadManagedDll(ACHAR const *path);
- static int ads_loadacadnet(void)
- {
- struct resbuf *pArgs = acedGetArgs () ;
- acedRetNil();
- if (pArgs && pArgs->restype == RTSTR) {
- Acad::ErrorStatus es = LoadManagedDll(pArgs->resval.rstring);
- if (es != Acad::eOk) {
- acutPrintf(_T("\nLoadManagedDll(\"%s\")=%s"),
- pArgs->resval.rstring,acadErrorStatusText(es));
- } else acedRetStr(pArgs->resval.rstring);
- }
- return (RSRSLT) ;
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=173
Опубликовано 19.08.2013Отредактировано 19.08.2013 в 14:36:03