Тема: Пустое сообщение при загрузке модуля

Здрасьте всем!
После компиляции ARX-модуля на некоторых компьютерах при его загрузке  выдается пустое сообщение (ну очень пустое, хоть бы "мяу" написали, что-ли), и приложение все равно загружается, но работает с глюками. Может кто-нибудь знает - что сие значит?

Re: Пустое сообщение при загрузке модуля

Что такое "пустое сообщение"? Где выдается - в командной строке или в MessageBox?

Re: Пустое сообщение при загрузке модуля

Сервис -> Приложения ...
Выбираю свой файл .arx, жму кнопку "Загрузить"
Выдается пустой MessageBox с кнопками OK и Отмена.
Жму ОК.
Приложение загружено.

Re: Пустое сообщение при загрузке модуля

С такой ситуацией не сталкивался, но могу предположить несколько вариантов (в порядке увеличения вероятности их появления):
1) глюк Windows;
2) глюк AutoCAD;
3) ошибка в DllMain этого приложения;
4) ошибка в диспетчерском цикле при обработке сообщения AcRx::kInitAppMsg - именно это сообщение посылается приложению при его загрузке. Возможно оно в этот момент пытается открыть диалоговое окно, не переключив ресурсы на себя.
Варианты могут быть еще, но без исходного кода точнее определить причину появления этого окна - трудно.

Re: Пустое сообщение при загрузке модуля

Вообще это уже не в первый раз. У других модулей тоже такое встречалось. Причем этот глюк проявляется не на всех компьютерах (я меня все работает прекрасно, а начинает глючить конечно же когда я представляю программу начальству :))
DLLMain обычный, я после мастера туда даже не заходил
#include "StdAfx.h"
#include "resource.h"
#include <afxdllx.h>
//-----------------------------------------------------------------------------
//----- Define the sole extension module object.
AC_IMPLEMENT_EXTENSION_MODULE(FormDLL)
#ifdef NEVER
AFX_EXTENSION_MODULE FormExtDLL ={ NULL, NULL } ;
#endif
//-----------------------------------------------------------------------------
//----- DLL Entry Point
extern "C"
BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) {
    //----- Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved) ;
    if ( dwReason == DLL_PROCESS_ATTACH ) {
        _hdllInstance =hInstance ;
        FormDLL.AttachInstance (hInstance) ;
        InitAcUiDLL () ;
    } else if ( dwReason == DLL_PROCESS_DETACH ) {
        FormDLL.DetachInstance () ;
    }
    return (TRUE) ;
}
По поводу пункта 4
содержание файла acrxEntryPoint.cpp
#include "StdAfx.h"
#include "Dlg.h"
//-----------------------------------------------------------------------------
#define szRDS _RXST("W_")
Dlg* dlg = NULL;
//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CFormApp : public AcRxArxApp {
public:
    CFormApp () : AcRxArxApp () {}
    virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
        AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
       
        HWND hwndAcad = adsw_acadMainWnd();
        CWnd *pWnd = CWnd::FromHandle ( hwndAcad );
        if( dlg == NULL )
        {
            if ( (dlg = new Dlg ( pWnd )) == NULL )  return (retCode);
            BOOL succeeded = dlg->Create( pWnd );
            if ( !succeeded )
            {
                acutPrintf("\nошибка при загрузке модуля для толщин линий\n");
            }
        }
        return (retCode) ;
    }
    virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
        AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
       
        dlg->DestroyWindow();
        dlg = NULL;
        return (retCode) ;
    }
    virtual void RegisterServerComponents () {
    }
    // ----- W_Form._dlg command
    static void W_Form_dlg(void)
    {
        if (dlg != NULL)
            dlg->ShowWindow(SW_SHOWNORMAL);
        else
            acutPrintf("\nне могу открыть окно!\n");
    }
} ;
//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CFormApp)
ACED_ARXCOMMAND_ENTRY_AUTO(CFormApp, W_Form, _dlg, dlg, ACRX_CMD_TRANSPARENT, NULL)

Re: Пустое сообщение при загрузке модуля

Чтобы долго не разбираться, попробуйте перетащить все, что содержится в On_kInitAppMsg в W_Form_dlg. Думаю, что ошибка уйдет навсегда...

Re: Пустое сообщение при загрузке модуля

Кстати, а где:

CAcModuleResourceOverride resOverride;

Ресурсы не переключены?

Re: Пустое сообщение при загрузке модуля

CAcModuleResourceOverride resOverride;
Никогда не пользовался.
Объясните, пожалуйста, неграмотному, что это за зверь такой :)
Другие же модули без него нормально работают.
Да, насчет перетаскивания кода, это вариант. Попробую.
Вообще, хотелось бы, чтобы форма после загрузки постоянно висела в памяти, но видать не судьба ...

Re: Пустое сообщение при загрузке модуля

Все ясно. Тогда начните изучение с примера из ObjectARX SDK samples\editor\mfcsamps\modeless Он очень похож на Ваше приложение и тоже создает немодальный диалог, который "висит в памяти". Только создается от не при загрузке arx-файла, ято идеологически неправильно, а при первом запуске команды. А потом продолжает "висеть", пока или приложение не выгрузится (возможно при завершении AutoCAD) или не будет запущена команда, которая его закроет.
Особенно внимательно просмотрите функцию BOOL startDlg() из файла sampdialog.cpp !!!
Ну а если в двух словах... CAcModuleResourceOverride resOverride; переключает ресурсы с acad.exe на Ваше приложение. В противном случае при создании диалога берутся ресурсы из acad.exe и вместо Вашего диалога может появится какой-нибудь из AutoCAD, вместо Ваших строк - AutoCAD-овские и т.д. Причем как раз возможна ситуация, что на одном компьютере вроде бы все работает нормально, а на другом - каша...

Re: Пустое сообщение при загрузке модуля

Ок, спасибо!
Да, здесь не все так просто... Это нам не Java :)
Вообще, то что диалог висит в памяти - это не дело, ведь юзер им пользуется крайне редко. Просто постоянно нужна табличка, которая на диалоге, чтобы по ее данным контролировать таблицу слоев. Потому кстати, его и надо запускать сразу при загрузке, а не по команде ...
Придется делать дополнительные структуры, чтобы не висел. Поговорка про ленивого программиста здесь не подходит :)