我正在尝试编写一个围绕C.dll(pbmman32.dll,如果有人熟悉它)的包装函数与c#一起使用。
查看源代码的头文件,虽然它们确实使用__declspec(dllexport)
,但它们似乎并未实现extern "C"{}
。我是否仍然可以在dllexport行丢失的情况下调用该dll中的函数?
例如:
BOOL PBM_Version (TCHAR* Buffer, WORD* Version, DWORD Size)
成:
[DllImport("pbmman32.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static extern bool PBM_Version(StringBuilder Buffer, StringBuilder Version, System.UInt32 Size);
答案 0 :(得分:1)
__declspec(dllexport)
是将函数标记为可导出的便捷方式,但它不是唯一的方法(例如,它们可能是使用.def文件导出的。
您应该能够查询DLL以获取所有导出的函数(您可以使用http://www.dependencywalker.com/之类的东西)。如果要导出您要呼叫的那个,那么您就可以了。
答案 1 :(得分:0)
供应商可能提供了一个头文件供您在导入时使用,而不是用于构建DLL的版本。更有可能的是,他们使用.def文件导出函数。但是没有强迫使用__declspec(dllexport)
。不要担心它的缺席。
我对你的翻译持怀疑态度。第二个参数可能是无符号2字节类型,作为out参数传递。声明如下:
out ushort version
使用version >> 8
解码主版本号,使用version & 0xff
解码辅助版。
单独读取头文件是不够的。您也必须阅读文档。
引起关注的另一个方面是使用TCHAR
。该库是否真的提供ANSI和Unicode导出?