sigurd99 |
опубликован 04-02-2002 14:01 MSK
Добрый день всем.Кто делал cpl`ки подскажите пожалуйста. есть код extern "C" __declspec( dllexport ) LONG /*APIENTRY*/ CPlApplet(HWND hwndCpl, UINT msg, LPARAM lParam1, LPARAM lParam2) { MessageBox(hwndCpl,"prev","switch", MB_OKCANCEL); switch (msg) { case CPL_INIT: //init environment here return 1; case CPL_GETCOUNT: return 1; case CPL_NEWINQUIRE: return TRUE; case CPL_INQUIRE: { LPCPLINFO pInfo = (LPCPLINFO)lParam2; pInfo->idIcon = IDI_ICON; /* pInfo->idInfo = IDS_DESC; pInfo->idName = IDS_NAME; */ pInfo->lData = 0; return 0; } case CPL_DBLCLK: { // show window here to configure MessageBox(hwndCpl,":)))",":-((((", MB_OKCANCEL); } return 0; case CPL_EXIT: // applet was closed return 0; } return 0; } в таком варианте после первого мессага вываливается Control_RunDll, а если поставить APIENTRY не запускает ни одного мессага. Заранее благодарен.
|
michl_m
|
опубликован 04-02-2002 20:48 MSK
Возможно, проблема простая: после обработки CPL_DBLCLK нужно вернуть return 1 ( непонятно, что ты нажал в MessageBox и что он вернул - Ok или Cancel ). Если я правильно помню, return 1 - это признак того, что сообщение успешно обработано, a ноль - признак ошибки. Вопрос следующий. Объявлять точку входа нужно действительно как APIENTRY. Иначе возникнут проблемы с типом вызова - __stdcall, __cdecl и прочее. Причем упадет скорее всего именно при возврате. Попробуй объявить функцию без extern "C" __declspec( dllexport ), а просто LONG APIENTRY CPlApplet(HWND hwndCpl, UINT msg, LPARAM lParam1, LPARAM lParam2). Только для этого в проект нужно включить файл с расширением def, что-то вроде myproject.def. В нем нужно написатьEXPORTS CPlApplet Тогда имя будет экспортировано, причем без изменений ( типа _CPlApplet@16 или типа того). Сейчас ты отменил конвертацию имени путем декларации extern "C". Но если добавить APIENTRY, экспортируемое имя, кажется, меняется ( посмотри раздел экспорта у твоей dll).
|