• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Проблемы С Подключением Библиотеки Dll

  • Автор темы evg2108
  • Дата начала
E

evg2108

Проблема заключается в следующем. Есть большой проект на C# - служба Windows. Этот проект использует сторонние нативные библиотеки (dll): Firebird со своей дотнетовской обёрткой, FFmpeg с самописной дотнетовской обёрткой. Все эти библиотечки 32х разрядные, то есть заточены под работу на x86. Но в то же время они нормально работают и на x64.

Далее, пишу на плюсах свою dll библиотечку (MFC), в которой есть несколько экспортируемых функций. Компилируется под x86. Подключается к проекту (проект отдельный от тех к которым подключены вышеописанные сторонние библиотечки) с помощью DllImport. Проект собирается и запускается под x86 нормально, а под x64 пишет что не удаётся загрузить библиотеку (типа Unable to load DLL 'xxxxx.dll': Не найден указанный модуль).
Скажите пожалуйста, если кто знает, в чём проблема и как решить её. Может нужны какие-то специфические настройки копилятора?

Помогите пожалуйста, я уже не знаю что делать...
 
M

-master-

Platform Target в настройках какие указаны?
 
E

evg2108

Пробовал уже, не помогает. Вот прямо сейчас на всякий случай попробовал ещё раз - ноль эффекта. При этом у тех проектов которые подключают сторонние нативные dll`ки в целевой платформе так же стоит AnyCPU, но в отличие от моей dll`ки функции из них вызываются нормально.

При этом в диспетчере задач видно что служба работает в режиме эмуляции: имя_службы.exe*32

и ладно бы оно везде не работало, так на x86 операционке работает нормально

что же я не правильно делаю...
 
M

-master-

Ну без проекта сложно что-то сказатью Если платформы не совпадают, то да пишет что не найдена длл.
А вот при совпадении платформ все ок, по крайней мере у нас так работает, без каких либо спец. телодвижений.
 
E

evg2108

без каких либо спец. телодвижений.

Если знаете, скажите пожалуйста, какие есть специальные телодвижения, чтобы наконец заработало. Я открыт для любых идей так как над этой проблемой уже неделю бьюсь... Может что-то надо делать в плюсовом коде или настройках его проекта?

Могу показать как я делаю:

в коде c++ проекта объявлена функция

C++:
extern "C" int __stdcall GetHValue( __in char* contractorId, __in byte* returnValue){ ... }

как видно из заголовка функции первый параметр принимает строку, а во второй параметр возвращается байтовый массив. Сама функция возвращает число байт в выходном параметре
в def-файле указано

Код:
LIBRARY

EXPORTS
GetHValue

в коде C# эта функция подключена вот так:

C++:
[DllImport("Native.dll", EntryPoint="GetHValue", CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurity]
private static extern int GetHValue(string contractorId, IntPtr bufferPtr);

этот метод вызывается вот так:

C++:
		[HandleProcessCorruptedStateExceptions]
public static byte[] GetHValueWrapper(string contractorId)
{
IntPtr bufferPtr = Marshal.AllocHGlobal(1024);
try
{
int length = GetHValue(contractorId, bufferPtr);
if (length > 0)
{
byte[] buffer = new byte[length];
Marshal.Copy(bufferPtr, buffer, 0, length);
return buffer;
}
}
catch (ThreadAbortException) { }
catch (Exception exception)
{
throw new GetHValueException(exception is AccessViolationException ?
new EnvironmentNativeInternalException("AccessViolationException", exception.Message) : exception);
}
finally
{
if (bufferPtr != IntPtr.Zero)
try
{
Marshal.FreeHGlobal(bufferPtr);
}
catch { }
}
return null;
}
 
M

-master-

Так а какая длл не находится, сборка c# или Native.dll?
 
E

evg2108

Кажется разобрался в чём дело. Точнее не в чём дело, а как сделать чтобы библиотечка подключалась. Пока не уверен до конца в успехе так как проверил всего один раз, а другая возможность проверить появится только завтра. Если всё подтвердится то напишу как получилось решить проблему.
 
G

Guest

Проблема заключается в следующем. Есть большой проект на C# - служба Windows. Этот проект использует сторонние нативные библиотеки (dll): Firebird со своей дотнетовской обёрткой, FFmpeg с самописной дотнетовской обёрткой. Все эти библиотечки 32х разрядные, то есть заточены под работу на x86. Но в то же время они нормально работают и на x64.

Далее, пишу на плюсах свою dll библиотечку (MFC), в которой есть несколько экспортируемых функций. Компилируется под x86. Подключается к проекту (проект отдельный от тех к которым подключены вышеописанные сторонние библиотечки) с помощью DllImport. Проект собирается и запускается под x86 нормально, а под x64 пишет что не удаётся загрузить библиотеку (типа Unable to load DLL 'xxxxx.dll': Не найден указанный модуль).
Скажите пожалуйста, если кто знает, в чём проблема и как решить её. Может нужны какие-то специфические настройки копилятора?

Помогите пожалуйста, я уже не знаю что делать...
Скачайте авто инсталлер !
 
E

evg2108

Короче, надо было просто включить статическую линковку MFC:

Свойства проекта -> Свойства конфигурации -> Общие -> Использование MFC
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!