MFC ActiveX调用C#dll的问题

一个大西瓜丶 2018-04-26 03:48:36
MFC ActiveX中调用了一个没有源代码的C#的dll,在自己电脑上能成功,但在其他电脑上调用dll函数失败。单步调试后发现获取的句柄不对,但有获取出来,也没有报错。然后获取dll里面的函数也就不对,调用函数的时候就报错了。查资料说c++调用C#dll要用另外的方法,但另外的方法有点没看懂,用了也到处在报错。

HINSTANCE hmod = LoadLibrary(L"function.dll");
if (hmod == NULL)
{
FreeLibrary(hmod);
}
else
{
_GetSerNum = (GetSerNum)GetProcAddress(hmod, "GetSerNum");
}


...全文
1221 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-04-27
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
真相重于对错 2018-04-27
  • 打赏
  • 举报
回复
感觉你那个dll不是.net的
一个大西瓜丶 2018-04-27
  • 打赏
  • 举报
回复
这是什么意思啊,是这个dll有问题吗
一个大西瓜丶 2018-04-27
  • 打赏
  • 举报
回复
自己顶一下,大神们求解。
paschen 2018-04-26
  • 打赏
  • 举报
回复
从你截图看,GetProcAddress调用并没成功
paschen 2018-04-26
  • 打赏
  • 举报
回复
引用 5 楼 一个大西瓜丶的回复:
[quote=引用 3 楼 paschen 的回复:] [quote=引用 2 楼 一个大西瓜丶的回复:][quote=引用 1 楼 paschen 的回复:] 检查GetProcAddress函数是否成功
成功了,没报错,不过LoadLibrary和GetProcAddress获取出来的值感觉不对。[/quote] 为什么感觉不对,如果成功了崩溃通常是在DLL中导致,比如接口不一致导致的非法访问等[/quote] 是在调用dll里面函数的时候报错了,但这个dll我没有源码,要怎么排查问题啊。[/quote] 确定调用约定等是否正确,你DLL和程序是用不同语言编写,变量等在不同程序表达是否一致,否则都可能导致崩溃
Saleayas 2018-04-26
  • 打赏
  • 举报
回复
你确定你的 .dll 是 C# 的程序集,而不是 COM 组件或者是本地动态链接库。 使用其他的工具查看一下, 至少你要先确定其导出的接口符号。
Saleayas 2018-04-26
  • 打赏
  • 举报
回复
C++ 中调用程序集可不是使用 LoadLibrary 的。 所以,你在自己的机器上是怎么成功的?
一个大西瓜丶 2018-04-26
  • 打赏
  • 举报
回复




到.cpp里面调用函数的时候报错

一个大西瓜丶 2018-04-26
  • 打赏
  • 举报
回复
引用 7 楼 Saleayas 的回复:
C++ 中调用程序集可不是使用 LoadLibrary 的。 所以,你在自己的机器上是怎么成功的?
我也不知道怎么成功的,之前也一直不行,后来有一天突然可以了,我也不知道做了什么。现在就这一台机可以用,其他的都不行。
一个大西瓜丶 2018-04-26
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
[quote=引用 2 楼 一个大西瓜丶的回复:][quote=引用 1 楼 paschen 的回复:] 检查GetProcAddress函数是否成功
成功了,没报错,不过LoadLibrary和GetProcAddress获取出来的值感觉不对。[/quote] 为什么感觉不对,如果成功了崩溃通常是在DLL中导致,比如接口不一致导致的非法访问等[/quote] 是在调用dll里面函数的时候报错了,但这个dll我没有源码,要怎么排查问题啊。
自信男孩 2018-04-26
  • 打赏
  • 举报
回复
if (hmod == NULL) 
{
    FreeLibrary(hmod);
}
hmod为NULL了,你还要freeLibrary,那不是对 NULL指针操作吗?
paschen 2018-04-26
  • 打赏
  • 举报
回复
引用 2 楼 一个大西瓜丶的回复:
[quote=引用 1 楼 paschen 的回复:] 检查GetProcAddress函数是否成功
成功了,没报错,不过LoadLibrary和GetProcAddress获取出来的值感觉不对。[/quote] 为什么感觉不对,如果成功了崩溃通常是在DLL中导致,比如接口不一致导致的非法访问等
一个大西瓜丶 2018-04-26
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
检查GetProcAddress函数是否成功
成功了,没报错,不过LoadLibrary和GetProcAddress获取出来的值感觉不对。
paschen 2018-04-26
  • 打赏
  • 举报
回复
检查GetProcAddress函数是否成功

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧