Он «перестал работать», когда я запускаю этот код. Я хочу вызвать эту простую функцию из API

0

Я просто хочу вызвать функцию из API. WhozCraig только что сказал мне, что мой - это всего лишь тип, а не функция. Но я до сих пор не знаю, как это решить. Как объявить это, а не просто typedef? Извините, я ноб. Спасибо за помощь ребята!

#include <Windows.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include "ftrScanAPI.h"

typedef FTR_API_PREFIX FTRHANDLE (FTR_API *MyftrScanOpenDevice)();


MyftrScanOpenDevice NowftrScanOpenDevice;


void main()
{
FTRHANDLE hDevice=NULL;
PVOID pBuffer;
FTRSCAN_IMAGE_SIZE ImageSize;

hDevice=LoadLibrary("ftrScanAPI.dll");
if(hDevice==NULL)

{   printf("Failed to detect ScanAPI.dll");
    getch();
    exit(EXIT_FAILURE);
}

hDevice = NowftrScanOpenDevice();
}

Вот фрагмент из API:

FTR_API_PREFIX FTRHANDLE FTR_API ftrScanOpenDevice();
Теги:
crash

1 ответ

1
Лучший ответ

Переменная NowftrScanOpenDevice является указателем на функцию, и поскольку она является глобальной переменной, она инициализируется нулем. Вызывая это, вы фактически разыскиваете указатель NULL, который является неопределенным поведением и приводит к сбою.

Вы должны использовать GetProcAddress для получения фактического адреса функции и назначить его NowftrScanOpenDevice:

...
HMODULE hLibrary = LoadLibrary(...);

NowftrScanOpenDevice = (MyftrScanOpenDevice) GetProcAddress(hLibrary,
                                                            "ftrScanOpenDevice");

hDevice = NowftrScanOpenDevice();
...

Примечание. Я добавил новую переменную hLibrary для дескриптора, возвращаемого LoadLibrary. Вам это нужно, чтобы позже позвонить в FreeLibrary.

  • 0
    Спасибо большое за вашу помощь! это решило все. Я многим вам обязан! = D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню