我有以下架构:
-1 c#wcf web service
-1 c#console应用程序
-1 c ++类库
-c。的Microsoft样本密钥存储提供商
我想要做的是在该示例密钥存储提供程序中调用Web服务。我在c#console应用程序中使用了一个带有方法的类来使用该Web服务并且工作得很好。我使用那个c ++类库作为c#console应用程序的包装器
好的,现在我在提供程序项目中创建了一个.h文件和.c文件,我尝试加载库类创建的dll,然后在提供程序的OpenKey函数中使用它。这个文件看起来像:
.h
#pragma once
//Declare ITEM struct again (the same definition from dll sources)
typedef struct {
unsigned char* data;
unsigned int len;
} ITEM;
//Declare function pointers
typedef ITEM(*_fptr_callWS) (char*, ITEM, char*); //pointer to a function
with the following signature: ITEM function_name (char* ,ITEM ,char* )
typedef void(*_fptr_freeITEM) (ITEM); //pointer to a function with the
following signature: void function_name (ITEM )
/*The ITEM returned is freed using
freeItem(ITEM) function*/
ITEM callWS(char* myAlias, ITEM hash, char* myPassword);
/*This function deletes an item which was returned from callWS(...)
function*/
void freeITEM(ITEM item);
.C
#include"dllWrapper.h"
#include <Windows.h>
#include <stdio.h>
ITEM callWS(char* myAlias, ITEM hash, char* myPassword)
{
ITEM signature;
signature.data = NULL;
signature.len = 0;
//Load DLL
HINSTANCE dllHandle = LoadLibraryA("serviceConsumerWrapper.dll");
if (!dllHandle)
{
printf("Error loading serviceConsumerWrapper.dll\n");
return signature;
}
//Get callWS function pointer from loaded DLL
_fptr_callWS fptrCallWS = (_fptr_callWS)GetProcAddress(dllHandle, "callWS");
if (!fptrCallWS)
{
printf("Error loading callWS function pointer\n");
return signature;
}
//call function callWS using function pointer
return fptrCallWS(myAlias, hash, myPassword);
}
void freeITEM(ITEM item)
{
//Load DLL
HINSTANCE dllHandle = LoadLibraryA("serviceConsumerWrapper.dll");
if (!dllHandle)
{
printf("Error loading serviceConsumerWrapper.dll\n");
return;
}
//Get callWS function pointer from loaded DLL
_fptr_freeITEM fptrFreeItem = (_fptr_freeITEM)GetProcAddress(dllHandle,
"freeITEM");
if (!fptrFreeItem)
{
printf("Error loading freeITEM function pointer\n");
return;
}
//call function freeITEM using function pointer
fptrFreeItem(item);
}
好的,现在我尝试在我的提供商中使用这些功能。我包括&#34; wrapper.h&#34;我尝试使用这些功能。我认出了它们,但我仍然遇到链接器错误。
Error LNK1120 2 unresolved externals provider
E:\Licenta_2016_Urian\New_site\Debug\SampleKSP.dll 1
Error LNK2019 unresolved external symbol _callWS referenced in function
_SampleKSPOpenKey@20 provider C:\Program Files (x86)\Windows
Kits\8.0\Cryptographic Provider Development
Kit\Samples\KeyStorageProviderSample\CPP\Provider\SampleKSP.obj 1
Error LNK2019 unresolved external symbol _freeITEM referenced in function
_SampleKSPOpenKey@20 provider C:\Program Files (x86)\Windows
Kits\8.0\Cryptographic Provider Development
Kit\Samples\KeyStorageProviderSample\CPP\Provider\SampleKSP.obj 1
顺便说一下,我在该类库创建的dll上使用了dumpbin,它似乎正确地导出了函数。