Я просто хочу вызвать функцию из 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();
Переменная NowftrScanOpenDevice
является указателем на функцию, и поскольку она является глобальной переменной, она инициализируется нулем. Вызывая это, вы фактически разыскиваете указатель NULL
, который является неопределенным поведением и приводит к сбою.
Вы должны использовать GetProcAddress
для получения фактического адреса функции и назначить его NowftrScanOpenDevice
:
...
HMODULE hLibrary = LoadLibrary(...);
NowftrScanOpenDevice = (MyftrScanOpenDevice) GetProcAddress(hLibrary,
"ftrScanOpenDevice");
hDevice = NowftrScanOpenDevice();
...
Примечание. Я добавил новую переменную hLibrary
для дескриптора, возвращаемого LoadLibrary
. Вам это нужно, чтобы позже позвонить в FreeLibrary
.