vsnprintf и snprintf заставляют dll не загружаться - PullRequest
0 голосов
/ 20 марта 2019

Я боролся с этим уже несколько дней. У меня есть проект Visual Studio .net, написанный на C #, который должен загрузить DLL, написанную на C, с использованием компиляторов gcc в IDE Codeblocks.

DLL может быть загружена и использована нормально, но когда я использую vsnprintf в dll, проект .net говорит: «Невозможно загрузить DLL. Указанный модуль не найден». всякий раз, когда я пытаюсь вызвать функцию из DLL.

Соответствующий код C #:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace Scratchpad
{
    public partial class frmMain : Form
    {
        [DllImport("testpielibs", CallingConvention = CallingConvention.Cdecl)]
        static extern void SomeFunction(string a);    

        private void button3_Click(object sender, EventArgs e)
        {
            SomeFunction("ABC");
        }
    }
}

Соответствующий код C (DLL):

#include <stdio.h>
#include <stdarg.h>

#define DLL_EXPORT __declspec(dllexport)

void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}

DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
    }
    return TRUE;
}

int  log_printf(char *format, ...)
{
    char msg[256];
    va_list ap;

    memset(msg, 0, sizeof msg);
    va_start(ap, format);
    vsnprintf(msg, 256, format, ap);
    va_end(ap);
    return 0;
}

Обратите внимание, что SomeFunction даже не вызывает log_printf. Проект строится нормально, независимо от того, и когда я закомментирую строку с помощью vsnprintf, он работает так же, как и с проектом .net, но именно эта строка приводит к невозможности загрузки dll в проекте .net.

В случае, если это важно, вот мои библиотеки компоновщика для DLL:

ws2_32
iphlpapi
mswsock
winmm
user32

Кроме того, я чувствую, что может быть важно отметить, что на днях, как раз перед тем, как все это произошло, я получил сообщение об ошибке из кодовых блоков, сообщающее о повреждении моего файла конфигурации. До этого этот проект работал нормально, но мне пришлось вернуться и вручную переназначить настройки компилятора и компоновщика.

Есть предложения?

ОБНОВЛЕНИЕ: snprintf вызывает ту же проблему. Я могу использовать sprintf и vsprintf, но snprintf и vsnprintf приводят к тому, что dll не загружается в проект C #, даже если dll будет по-прежнему создаваться без ошибок или предупреждений. Я рассмотрел соглашения о вызовах, используемые для импорта моих функций dll в мой проект на c #, и Cdecl, похоже, подходит для этого, поскольку в нем конкретно сказано, что он «позволяет вызывать функции с помощью varargs, что делает его подходящим для использования для методов, которые принимают переменное количество параметров, таких как Printf. " Я также попытался импортировать SomeFunction с использованием соглашений о вызовах Winapi, StdCall и ThisCall, но все они имеют одинаковые результаты. Буду очень признателен за любую помощь, я был на некоторое время в тупик.

...