проблема в вызове dll в письменном виде вызывающего процесса - PullRequest
0 голосов
/ 16 сентября 2010

У меня есть следующая функция, определенная в одной DLL:

__declspec( dllexport ) int __stdcall
mjscall(char *cmd, DWORD wtime, char *stdoutfile, char *stderrfile )

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

#include <windows.h>
#include <windows.h>
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <limits.h>
extern __declspec( dllexport ) int __stdcall mjscall(char *cmd, DWORD wtime, char *stdoutfile, char *stderrfile );
typedef INT (*MJSCALL)    (char *,DWORD, char *, char *);
int main()
{

    char *a,*b,*c;
    a=NULL;
    b=NULL;
    c=NULL;
    DWORD aa =1;
    int i;
    HMODULE hLib;
    MJSCALL ADD;
    hLib=LoadLibrary("f3cucall.dll");
    if(hLib==NULL)
    {
        return 1;
    }
    ADD=(MJSCALL)GetProcAddress(hLib,"mjscall");
    if (ADD==NULL)
    {
        return 1;
    }

    (ADD)(a,aa,b,c);
     return 0;
}

«(ДОБАВИТЬ) (а, аа, б, в);» вызывает проблему. Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 16 сентября 2010

Я думаю, что вы перепутали две вещи:
ключевое слово __declspec(dllexport) MSVC экспортирует функции из DLL (говорит компоновщику сделать это), а __declspec(dllimport) импортирует функции из DLL.Это делается во время загрузки, компоновщик создаст весь необходимый код для загрузки DLL и разрешит символ.Фактически, он добавляет некоторый код в exe, чтобы позволить ОС загружать DLL.Вы можете использовать функции, объявленные с __declspec(dllimport), как и любую обычную внутреннюю функцию.

Если вы хотите использовать этот подход, вам нужен файл библиотеки DLL, так как он содержит информацию для компоновщика, чтобы разрешить символическое имя.На самом деле он не содержит код, только эту информацию о DLL для компоновщика.Кроме того, вы должны сообщить компоновщику, что функция, которую вы хотите использовать, находится в DLL, используя магию __declspec (dllimport) перед объявлением функции.Вот почему вы предоставляете .lib и заголовочный файл (содержащий эти объявления) с вашей DLL, если вы хотите сделать это таким образом.Вам следует перестроить проект, который использует DLL, когда вы меняете DLL, так как файл .lib мог измениться.Вы можете использовать тот же файл заголовка в вашем проекте DLL и проектах, которые импортируются из этой библиотеки DLL:

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

MYDLL_API void printMe(int);

MyDLL_API разрешается либо в __declspec (dllexport) (в проекте DLL, где вы определяете MYDLL_EXPORTSв настройках проекта) или __declspec (dllimport) (во всех проектах, использующих dll).Таким образом, вам нужен только один заголовочный файл для DLL.

Другим методом вызова функций DLL является использование LoadLibrary и GetProcAdress.Эти два используются для загрузки DLL во время выполнения.Основное различие между загрузкой DLL во время загрузки и во время выполнения состоит в том, что у вас есть некоторый контроль над загрузкой DLL во время выполнения, тогда как ОС будет выполнять эту работу, когда DLL должна загружаться во время загрузки (например, показывать окно сообщения, еслиDLL не может быть найдена и не запускает процесс).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...