C++ 从C+调用C DLL+;提供访问冲突,但DllImport正在工作的C#项目
我有一个需要集成的32位第三方C DLL,但遇到了一个难以理解/跟踪的错误 < >我可以编译并成功连接一个简单的C++ 32位应用程序,包括以下内容:C++ 从C+调用C DLL+;提供访问冲突,但DllImport正在工作的C#项目,c++,c,dll,C++,C,Dll,我有一个需要集成的32位第三方C DLL,但遇到了一个难以理解/跟踪的错误 < >我可以编译并成功连接一个简单的C++ 32位应用程序,包括以下内容: #include "stdafx.h" #include <windows.h> extern "C" int __stdcall external_method(int cardno); int main() { int n = external_method(0); return 0; } Unhandled
#include "stdafx.h"
#include <windows.h>
extern "C" int __stdcall external_method(int cardno);
int main()
{
int n = external_method(0);
return 0;
}
Unhandled exception at 0x100AADF5 (ExternalModule.dll) in
ConsoleApplication2.exe: 0xC0000005: Access violation reading location 0x00000000.
但是,如果我创建一个简单的C#应用程序,使用DllImport/PInvoke调用相同的函数,它运行良好:
namespace ConsoleApplication3
{
class Program
{
[DllImport("ExternalModule.dll")]
public static extern int external_method(int n);
static void Main(string[] args)
{
external_method(0);
Debug.WriteLine("YES!");
}
}
}
我很难理解一个怎么工作,另一个怎么失败。不幸的是,我无法访问C DLL的开发人员
非常感谢您的帮助
更新谢谢你的评论。以下是该方法的头文件条目:
int __stdcall exernal_method(int cardno);
我有理由确信呼叫约定是正确的。正在加载DLL,因为使用DLL的调试版本,我可以看到它在失败之前将一些消息输出到调试输出
堆栈在方法退出时被损坏,这可能是一个问题吗?我尝试了几种不同的调用约定,但这是链接器能够使用的唯一约定。堆栈损坏的可能性不大 一个可能的原因是不同的DLL加载方法。您的C++应用程序静态加载(Windows在进程启动之前加载DLL),动态地动态调用C(CLR在进程启动后加载DLL)。要测试这个假设,请移除链接器中的外部模块.LIB,更改C++代码来调用LoadLibrary和GETPROCEDATION。
另一个可能的原因是C运行时初始化COM,C++应用程序不,而你的DLL尝试使用COM。在C++应用程序中,尝试在您的OpnLaLy方法之前添加CONPROCEDALID[EX]。< /P>不是一个C用户,但是它可能是一个调用约定不匹配吗?C和C代码之间没有区别。你必须寻找一个环境原因。一个电话号码。你的C++程序找不到DLL,还是找不到它的不同版本?链接器可能只是链接到导入库,所以它不会抱怨。调试器或它没有发生这是第二个原因!感谢you@jugglingcats不客气。也不要忘记初始化。通常它应该在线程退出之前完成。