首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于封装成DLL,该怎么解决

2013-11-15 
关于封装成DLL我有一个项目,在此项目中A(exe)模块调用了B(DLL, C++编写,静态加载的方式)和C(DLL, delphi编

关于封装成DLL
我有一个项目,在此项目中A(exe)模块调用了B(DLL, C++编写,静态加载的方式)和C(DLL, delphi编写,LoadLibraryEx方式加载)。后来因为项目需求改变,需要把A封装成DLL供C#调用,封装完后,发现C#通过A调用B时可以成功的,可是当调用C的时候,就会直接崩溃,报错:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
打断点发现崩溃的地方就是A中调用C函数的时候,希望能得到你的帮助,谢谢。
[解决办法]
A(exe)时调用C(dll)是否有问题?
[解决办法]
1. c# dllimport 声明中指定的 调用约定不对
2. 传递的参数大小原型不对.
一般是前者, c/c 默认 c 调用约定,  c# 默认 stdcall

如果不是, 你把函数原型列出来看看.
[解决办法]

引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

A(exe)时调用C(dll)是否有问题?

可以成功调用

C(dll)是通过A(dll)而使用的。那就可以在A里跟踪与C有关的每一个环节,找到发生错误的具体位置。考察:
LoadLibrary调用;获取C里的函数地址;调用C里的函数。
每一步是否成功。发生错误时调用GetLastError,再分析原因。

GetLastError返回0;
打断点发现LoadLibrary返回的HINSTANCE 提示 unused cxx0030 error expression cannot be evaluated;
原因有可能是出在这里吗?谢谢

看样子是LoadLibrary失败了。看看C(dll)及其依赖的DLL是否都能被顺利找到(在DLL搜索路径上)。

DLL都在路径下;
要是LoadLibrary失败,返回的不应该是个NULL吗 可是我已经判断了,结果不是NULL


LoadLibrary应该是成功了,HINSTANCE的指针值一般指向系统保护内存,因此不能evaluated
测试下GetProcAddress是不是成功了?

热点排行