Ваша проблема связана с тем, что управление памятью WM5 - дерьмо. DLL загружаются сверху вниз, а приложения загружаются снизу вверх. Если между вашим приложением и вашей DLL недостаточно места, вы получите ошибку «not pinvoke».
WM5 выделяет 32 слота по 32 МБ для приложений, на которые они могут работать.
Каждый раз, когда WM5 выделяет память для dll, он использует минимум 64Kb блока, поэтому, если ваша DLL 32K, это займет 64K, если ваша DLL занимает 68k, то WM5 выделит 2x64Kb - 128Kb.
Когда WM5 загружает необходимую DLL, она всегда будет загружаться по нижнему адресу предварительно загруженного приложения, т. Е. Если приложение 1 загрузило библиотеки DLL размером 2 × 30 КБ, первое будет загружено по адресу от 0 до 64 КБ, второе из 64–128, тогда ваше приложение будет загружать свои библиотеки DLL из 128 КБ, а не 0, даже если ваши приложения работают в отдельном слоте.
Для того, чтобы все заработало, вам придется загрузить приложение раньше или удалить ненужные приложения из папки Windows Starup.