问题介绍:我必须通过DLL文件、LIB文件和函数声明为dllimport的c头文件提供的API来控制某个设备。当我在C++项目中使用API时,一切正常-我包含了header、lib、dll,并调用了header文件中声明的函数。当尝试使用[DllImport]属性从C#.NET项目调用这些函数时,问题就开始了:函数是用准确的名称和参数声明的,并且运行代码没有抛出任何异常。然而设备根本没有响应,就像这些功能从未真正被调用过一样。在C头文件中是如何声明的:int__declspec(dllimport)Init_Card_RTx(unsignedshortdevice_num,unsign
我需要根据加载它的进程在dll中做一些事情。因此,作为Windows编程的新手,我需要帮助弄清楚如何找到加载当前dll的exe。到目前为止,我一直在对exe文件名进行硬编码,这是最愚蠢的做法:D1)有人建议使用GetModuleFileName()函数。但这似乎使我的应用程序崩溃了。(我使用0作为模块句柄)。我什么都没做。我使用了以下语法GetModuleFileName(0,&fileName,MAX_PATH)编辑:我从here了解到我无法通过此调用获取.exe名称,因为它仅返回dll名称:(2)在DllMain中执行此操作是个好主意吗??我知道DllMain不是做复杂事情的地方。
我正在尝试创建一个Cdll的包装器,我正在尝试调用一个函数,该函数采用回调函数,接收一个对象作为传回的指针。.h文件删除externintSetErrorHandler(void(*handler)(int,constchar*,void*),void*data_ptr);处理程序是一个回调函数,在发生错误时调用,data_ptr是传回给您的任何对象(状态),在我的应用程序中就是这个(当前对象)。我能够在使用编码常量类型(如简单类型字符串、整数等)的dll中调用函数。但我不知道如何编码指向作为状态的C#对象的指针。为了将我通过在此处搜索找到的对象引用传递给C函数,否则我似乎需要一个结构
我正在尝试在第3方基于Lisp的程序(我们称之为ABC)和我自己编写的C#程序(我们称之为DEF)之间创建一个集成。问题是ABC只能调用用C或Fortran创建的程序集。所以我开始学习C,我得到了“helloworld”测试,ABC调用我的Cdll并得到“helloworld”作为返回。我尝试使用显式加载和GetProcAddress从C代码调用我的DEFdll。如果我调用另一个Cdll,而不是C#dll,它会起作用。现在我想知道我是否必须学习C++并从C++调用C#来创建这个漂亮的调用链:ABC->C->C++->DEF(C#)->C++->C->ABC如果这是唯一的方法,谁能帮我举
这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:pinvokestackimbalance—howcanIfixthisorturnitoff?我需要从c#代码访问一个c++dll库(我没有源代码)。例如以下函数:UINT32myfunc1()UINT32myfunc2(INchar*var1)UINT32myfunc3(INchar*var1,OUTUINT32*var2)对于myfunc1我使用下面的代码没有问题:[DllImport("mydll.dll")]publicstaticexternintmyfunc1();另一方面,我无法使用myfunc
我正在尝试将一些代码移动到共享库中(在独立编译时工作正常)但遇到了类内联函数的一些问题。mingw/gccv4.7.2.部分问题似乎是因为我更喜欢在类声明之外定义我的内联函数(它使类声明更整洁且更易于阅读)。我一直认为这是可以接受的,相当于在类声明中定义……但情况似乎并非总是如此。我创建了一个简单示例来演示这些问题。(显然,dllexport通常在宏中以在导入/导出之间切换。)标题://Uncommentoneatatimetoseehowitcompileswith:-O2-Winline//#defineINLINE_OPTION1//implicit-buildswithouti
我正在改进一个DLL模块,它充当Windows应用程序的一种插件。此插件与单个软件系列的各种版本兼容。现在,对于某些功能,我必须访问父软件的配置文件。由于不同版本的软件在不同的地方都有这些,所以我必须找出哪个版本加载了DLL。可以通过进程可执行文件名称(即abc_v1.exe、abc_v2.exe、abc_v3.exe)轻松辨别不同的版本。有没有办法获取加载DLL的进程的名称?我正在使用C++和一些基本的WinAPI命令,但不是ATL、MFC等。目前我正在使用它自己的SDK功能轮询父软件,但这需要打开连接。根据配置文件的内容,DLL不需要打开连接,所以我想知道在建立通信之前加载它的版本
我的应用程序使用一个版本的库(a.dll),我正在使用另一个DLL(b.dll),后者又使用我使用的同一库(a.dll)的旧版本。我正在通过嵌入list文件来构建应用程序。我使用的DLL也使用嵌入式list文件。我的WinSXS文件夹中有两个版本的库。我的应用程序无法加载适当版本的DLL。有一个单独的list文件(不嵌入到DLL中)是否有助于解决问题?解决方法是什么? 最佳答案 您的情况正是WinSxS应该解决的情况。它应该可以正常工作。或者:list文件指向同一版本,或者其中一个list文件没有正确嵌入,或者WinSxS中的共享程
伙计们,如果我在我的dll代码中覆盖全局新建和删除,这会覆盖用户代码新建和删除吗?我做了一个测试,显示用户new和delete不会受到影响。如果我想让用户代码new和delete被我的sdknew/delete替换,怎么做。模板类是什么情况。模板类定义包括一些新建/删除。用户代码可能会实例化它。那么,它可能会使用用户新建/删除,对吧? 最佳答案 不,在Windows上每个DLL都有自己的operatornew()/operatordelete()。但是你应该小心-如果某些DLLnew是一个对象,该对象应该使用相同的operatord
我有一个由许多DLL文件组成的游戏。其中一些DLL链接到同一个静态库(LIB)。所以像这样:Game.exe->Root.dll->Child.dll|||'->Common.lib(contains__declspec(thread))|'->Common.lib(contains__declspec(thread))Root.dll加载静态链接Common.lib的Child.dll。Root还静态链接Common.lib。因为Common是静态链接的,所以它直接编译到加载dll中(例如Root和Child)。Common.lib包含一个使用线程本地存储(TLS)的变量。__dec