- 主题:动态库这么导出函数的活久见
纯吐槽,下午调个读卡的库,按文档调死活加载失败,
四五年没碰Win32了还怀疑自己是不是年纪大了,最后发现:
头文件是
extern "C" __declspec(dllexport) int FRI_OpenPort(int iPort);
文档里也是FRI_OpenPort
然后实际动态库导出的函数是 _FRI_OpenPort@4
读卡机具厂商接触这么多了,导出函数都搞那么不规范的,活久见。
--
FROM 115.205.173.*
不是LoadLibrary动态加载,就是静态加载。
【 在 z16166 的大作中提到: 】
: 你是用LoadLibrary显式load的?他预期可能是用lib link后通过导入表隐式load。这样对函数名的修饰是一致的,不一致的话在link阶段就会报错。
: 但是调用者是__declspec(dllimport),被调用者才是__declspec(dllexport)
--
FROM 115.205.173.*
lib没用,因为我们开发商还在用Power Builder这个上古玩意,
昨天PB开发和我说动态库加载不起来,
我打算用Delphi给他们封装下试试看,也不行,最后PE工具发现动态库导出的不对。
【 在 dormouseBHU 的大作中提到: 】
: 这种都会提供.lib文件吧… 需要自己写代码加载的情况不多
--
FROM 115.205.173.*
就给了这么一个header,lib没注意,反正开发是PB和Delphi或者C#,都用不到lib
反正移民局给的demo是C#的,我倒是没注意.net里的DllImport为啥能把那些前缀的下划线和后缀的参数长度给抹掉了,主要是从没见过公用Dll导出函数不是WINAPI规范的。
【 在 marxn 的大作中提到: 】
: 这个是动态库开发者的头文件吧,另外应该提供给调用者的头文件和.lib文件
--
FROM 115.205.173.*
no no, 大家都是stdcall,
我的调用方是默认就走stdcall的, 最后也调成功把卡里信息都dump出来了,
然后我们换了另一家的读卡接口拉倒.
【 在 marxn 的大作中提到: 】
: 我看了一下规范,你这个dll应该遵循的是stdcall规范。而你的程序使用cdecl方式链接的。
: 你在header里给这个函数加上__stdcall应该能解决问题。
--
FROM 115.205.173.*
no no,和C#没啥关系,C#只是做了调用demo而已。
【 在 AlphaO 的大作中提到: 】
: C#生成的库默认只能与C#互通,要想与C兼容需要额外设置
--
FROM 218.74.53.*