繁体   English   中英

从Win32控制台应用程序调用dll [C]

[英]Calling dll from a Win32 Console Application [C]

大家好,谢谢您的宝贵时间。 这是在Visual Studio 2012中创建的,而我使用的是标准Windows库。

我正在尝试显式调用DLL函数,并且我相信所编写的代码是正确的; 但是,我收到一个错误。 我不确定在小型C控制台应用程序中或从无法访问其内部工作原理的DLL中编写的某些内容是否出错。

//global area

HINSTANCE _createInstance;
typedef UINT (CALLBACK* LPFNDLLFUNCLOOKUP)(AccuInput*, AccuOut*);
LPFNDLLFUNCLOOKUP lpfnDllFuncCASSLookup;
typedef UINT (CALLBACK* LPFNDLLFUNCINIT)(BSTR);
LPFNDLLFUNCINIT lpfnDllFuncInit;
typedef UINT (CALLBACK* LPFNDLLFUNCCLOSE)(); 
LPFNDLLFUNCCLOSE lpfnDllFuncClose;
HMODULE unmanagedLib;

这是我的主要功能:

int main() {

// Load Library
BSTR configFile;
unmanagedLib = LoadLibraryA((LPCSTR) "AccuAddressUnMgd.dll");
// Initialize AccuAddress COM dll
lpfnDllFuncInit = (LPFNDLLFUNCINIT)GetProcAddress(unmanagedLib, (LPCSTR)"Init");
// This function will lookup the address
lpfnDllFuncCASSLookup = (LPFNDLLFUNCLOOKUP)GetProcAddress(unmanagedLib, (LPCSTR)"AccuCassLookup");
// This function will call AccuAddress COM DLL Close function
lpfnDllFuncClose = (LPFNDLLFUNCCLOSE)GetProcAddress(unmanagedLib, (LPCSTR)"Close");
// Append “config.acu” file path.
configFile = SysAllocString(L"C:\PathTo\Config.acu");
printf("ConfigPath created");
lpfnDllFuncInit(configFile);
printf("ConfigFile consumed");
SysFreeString(configFile);
return 0;
}

这是我收到的错误:

Unhandled exception at at 0x75D4C54F in RDISample1.exe: Microsoft C++ exception: _com_error at memory location 0x001AFAC0.

错误发生在:

lpfnDllFuncInit(configFile);

因此,我想我的问题分为两个部分。 基于代码,我可以说出错误是在DLL函数中吗?

第二个问题,当调用GetProcAddress时 ,将字符串封装在LPCSTR中(如函数转换还是类型转换)的意义(如果有的话)是什么?

lpfnDllFuncClose = (LPFNDLLFUNCCLOSE)GetProcAddress(unmanagedLib, LPCSTR("Close"));

再次感谢您的帮助。 我一直在进行大量研究,但DLL仍然令人困惑。

最初的错误是由您正在使用的库无法正确处理不存在的文件引起的。

您给出的路径包含单斜杠\\ ,它们被当作转义符,而不是路径分隔符。 路径分隔符必须转义,即\\\\才能正确处理。

将字符串文字转换为LPCSTR没有意义。

至于肯定来自DLL的_com_error。 我建议将其包装在:

try
{
  ...
} catch(_com_error const & e)
{
  wprintf(L"Caught a com error: %s\r\n", e.ErrorMessage());
}

然后,您也许可以找出问题所在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM