Ну, а по логике вы сами то видите, что переменная pMxApp, используется для получения переменной pDoc, которая в свою очередь нужна только для получения первого в списке слоя...
pLayer := pDoc.FocusMap.Layer[0];
Было бы очень грустно, если бы без неё нельзя было обойтись...
Крайний раз поясню по переменным:
1) Переменная типа (диспатч интерфейс) IApplication, нужен для сопряжения и работы с приложением ArcMap, эта переменная используется также во встроенном калькуляторе. В общем во всех случаях, когда Вашу библиотеку (сборку) вызывает приложение ArcMap, ArcCatalog.
2) Переменная IMapContol2(2-4) используется когда Вы знаете что Вам управление передаст непосредственно MapControl, то есть это приложения ArcEngine, и возможно (но не знаю точно - Веб приложения)...
3) Интерфейс IHookHelper "научен" съедать (приводить) основные типы переменных (диспатч интерфейсов - IMapControl, IApplication, и т.д.) и на выход предоставлять только необходимые "отростки", интерфейсы IMap и IActiveView.
В Вашем примере, Вам по сути необходим интерфейс IMap, и то, только для того чтобы получить "слой 0"...
Если, уж совсем всё печально, ниже привожу готовый код:
var
pHook : IHookHelper;
//...
//...
//...
procedure TMAPCOMServerDima.OnCreate(const hook: IDispatch);
begin
if supports(hook,IMapControl) then Begin
// ShowMessage('Нас вызвал MapControl');
pHook:=CoHookHelper.Create as IHookHelper;
pHook.hook:=hook;
End;
end;
procedure TMAPCOMServerDima.OnClick;
var
///
///
Begin
pLayer := phook.FocusMap.Layer[0];
// Дальше по тексту
End;