Tag: visual c ++

VC ++在解决方案中从非/ clr项目的函数调用/ clr项目的函数

在提出这个问题之前我提到了这个有点类似的问题 ,但无法解决我的问题 我正在寻找一个包含许多解决方案的旧应用程序。 问题出现在其中一个解决方案中(比如说S)。 情况如下: S中的项目(比如说P1)包含所有C / C ++文件,需要调用C#函数 由于P1也包含.c文件,我不能使用/clr选项 如果我将P1中的.c文件编译为.cpp文件,那么它会产生大量错误,我不打算更改旧版.c文件中的源代码 所以我创建了另一个启用了/clr项目(比如P2),并为函数声明创建了一个头文件,为函数定义创建了一个.cpp文件; C#呼叫是在它下面进行的; P2编译好 请注意,P1是.dll,P2是作为静态库创建的; 在P1的“框架和参考”中提到了P2 和警告: 警告LNK4098:defaultlib’MSVCRT’与使用其他库冲突; 使用/ NODEFAULTLIB:库 现在有了这些,我在P1中得到3个链接器错误: 错误LNK2005:已在libcmtd.lib(typinfo.obj)中定义的“private:__thiscall type_info :: type_info(class type_info const&)”(?? 0type_info @@ AAE @ ABV0 @@ Z) 错误LNK2005:已在libcmtd.lib(typinfo.obj)中定义的“private:class type_info&__thiscall type_info :: operator =(class type_info const&)”(?? 4type_info @@ AAEAAV0 @ ABV0 @@ Z) 错误LNK1169:找到一个或多个多重定义的符号 许多在线论坛(包括本网站)都提供此错误。 但不知怎的,我在尝试这些选项后无法修复它(我是.NET框架的新手)。 重要的是,即使我从P2中删除了C#代码,也会出现相同的错误。 修复它的正确方法是什么? 更新 […]

如何在.NET应用程序中使用C ++项目?

我是一名常规.NET开发人员,旨在将C ++库集成到.NET项目中。 我有一些想法,但由于我一般都是C ++的新手,所以我不知道我正在尝试使用的技术的局限性。 C ++项目本质上是一个快速的声音渲染器,可以使用一堆不同的后处理技巧播放多轨音频文件。 所有这一切都很酷,但考虑到我想要集成一个简单的.NET WinForms应用程序,事情开始变得混乱。 首先,C ++项目没有.NET绑定或ActiveX / COM集成。 它是一个简单的’ol MS VC ++ 9项目。 如果我在我的.NET应用程序中使用该项目,我将不得不以某种方式与它进行交互 ,即。 创建类实例,设置属性,调用方法,编组进出数据等。 其次,它可以作为独立的Windows应用程序运行,并使用MS Windows API管理自己的Windows。 这很好,但不知怎的,我需要在后台运行 .NET VM,管理节目并运行我所有的C#代码。 我不编写C ++所以我需要坚持使用C#来围绕这个lib构建一个应用程序。 第三,无论我是否在与C ++ lib相同的进程中运行,我都需要一种方法来构建/接口/调试这两个独立的应用程序,就像它们是一个一样。 我没有C ++编程的背景,除了我为高性能数据操作编写了几个C ++ DLL。 所以,很多问题,不知道如何开始! 我可以完全编译这个lib并将其放入VC EXE,但是如何将我的.NET代码共同编译成它? 或者,如何将C ++代码编译到.NET EXE中,以便它在托管环境中运行? 请注意,它不是为此设计的,如果我尝试改变太多,可能会行为不端。 主要问题是与它接口 。 如何公开一些要从.NET访问的C ++类? 我确切地知道我需要哪些类,并且我只需要几十个类以及它们可以从.NET获得的相关方法/属性。 我不介意.NET中的手写包装类来帮助.NET VM理解来回传输的字节的类结构。 我希望我可以直接使用托管环境中的C ++对象,因此我的大多数代码都可以保留在.NET中。 即使我作为一个独立的应用程序运行它,我是否必须求助于套接字或与之通信? 这是绝对更糟糕的情况,我会做任何事情来避免这种情况。 任何帮助或指示都表示赞赏,我希望我能够完成自己的工作并完成我的任务,并且我的问题足够具体并且可以回答。 谢谢你的帮助! […]

如何计算C#.net文件的CRC值?

我想在C#.net中使用32位算法计算文件的CRC值….

除非我引用项目,否则无法加载WinRT组件

我遇到了一个奇怪的问题。 我创建了一个Windows运行时组件(用于Windowsapp store),它通过一些C#包装器类为.NET提供了一些旧的C / C ++代码。 我编写了一个测试工具Store App(以下简称“test1”),它引用了WRC 项目 (两个项目都在同一个解决方案中)。 它调用组件,一切正常。 接下来,我从WRC项目中获取以下输出文件: MyWrtComponent.dll MyWrtComponent.exp MyWrtComponent.pdb MyWrtComponent.pri MyWrtComponent.winmd …并尝试从其他商店应用项目(“test2”)使用它们。 在这个项目中,我添加了对.winmd文件的引用,而不是引用MyWrtComponent项目。 一切都很好,但是当我运行test2应用程序时,一旦我尝试使用MyWrtComponent中实现的一个C#类,我就会从mscorlib获得一个System.IO.FileNotFoundexception: at System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD) at MyWrtComponent.MyWrtClass..ctor() The specified module could not be found. (Exception from HRESULT: 0x8007007E) 使用MyWrtComponent的发布与调试版本没有任何区别。 在test2上运行ProcMon,我看到几次加载vccorlib120_app.DLL(或者如果我正在构建调试时为vccorlib120d_app.DLL)的尝试失败: QueryOpen F:\test2\bin\Debug\AppX\vccorlib120d_app.DLL NAME NOT FOUND QueryOpen F:\test2\bin\Debug\AppX\vccorlib120d_app.DLL NAME NOT FOUND CreateFile C:\Windows\SysWOW64\vccorlib120d_app.DLL NAME NOT FOUND 我已经确认我的C:\ Windows […]

DEBUG ERROR:在vc ++项目中使用COM时出现所需的运行时?

我为我的工作创建了一个COM组件。 我也注册了该组件。 在我的系统上,我有两个VM工作站。 在我的第一个工作站,它工作正常。 在我的第二个工作站中,它会显示一个错误框,其中包含此程序需要朗读的消息并以不寻常的方式关闭请联系应用程序管理员 。 我认为这是因为没有在第二个工作中注册dll然后我注册并且它工作正常。 当我试图在win2k8机器上测试相同时,即使我成功注册COM组件,它显示上面说的erroe窗口? 任何人都可以帮我理解这个吗? 提前致谢…

从C#WinForms应用程序打开时,以VC ++forms标记导航问题

我有一个C#应用程序具有各种输入控件(TextBox,ComboBox,按钮等)以及选项卡控件。 在其中一个选项卡中,我有一个嵌入在其中的非托管C ++窗口。 C ++窗口也有很少的输入控件。 使用Tab键,我可以导航到C#控件witohut任何问题。 但是,当我在C ++窗口中选择一个控件并按Tab键时,它不会将焦点转移到C ++窗口上的下一个控件。 相反,它将焦点设置为C#控件的控件。 根据下面的post,如果我们有一个嵌入式非托管表单,在托管级别(C#应用程序),.NET控件将不知道它有任何子级。 如何将非托管C ++表单嵌入到.NET应用程序中? 这有什么解决方法吗?

没有调用WH_KEYBOARD_LL挂钩

我在使用WH_KEYBOARD_LL钩子时遇到了一些问题: 我使用全局LL钩子的原因并不重要我只需要它为我的应用程序(我尝试了其他类型的钩子,但它们对我不起作用)。 钩子函数在一个dll中,dll在应用程序启动时加载,钩子也在主线程启动时设置。 这非常有效。 当我需要停用挂钩并重新激活它时,会出现问题。 如果我从应用程序的主线程执行此操作它可以正常工作,但我需要的是从计时器执行此操作,这里出了问题。 我使用计时器来检查我的应用程序的窗口是否是前台窗口(活动窗口),如果是,则挂钩被激活,如果不是,则挂钩被停用。 从计时器调用时SetWindowsHookEx的返回值总是ok(非null),根据MSDN,这意味着钩子已成功设置,但我的钩子函数永远不会被调用。 以下是我设置钩子的方法: SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHookProcedure, GetModuleHandle(curModule.ModuleName), 0); 有没有人经历过这个? 我唯一的猜测是我的钩子函数在一个DLL中,而计时器回调来自另一个dll,这与我的问题有什么关系吗?

如何使用C ++ / CLI Wrapper将变量参数从托管传递到非托管?

要在托管域中实现params(可变参数)function,我们在c ++ / cli中执行以下操作,例如: funcManaged(int n, …array^ variableParams) 我对如何将其传递给接受可变参数的非托管域感到茫然。 funcUnmanaged(int n, …) 我试图传入数组,但结果很糟糕(访问冲突,垃圾数据等)。 //where unmanagedVariableParamsArray is an int array funcUnmanaged(int n, unmanagedVariableParamsArray); 资源建议创建一个va_list并传递它, vFuncUnmanaged(int n, va_list vl) 但是如何在c ++ / cli域中创建va_list以接受variableParams ? 重构遗留的非托管代码库并不是一个理想的解决方案。

你如何在c ++中调用ac#方法?

他们在这里和这里谈论要做什么,但我似乎无法在c ++中找到我的c#项目。 我已经在c ++项目中添加了c#项目作为参考,但每当我尝试使用我需要的方法时,它都找不到命名空间。 我通过右键单击c ++项目添加它并进入’reference’然后添加了c#项目并添加了新的引用。 两个项目都在同一个解决方案中。 在下面的代码示例中,我给出了完整的c#代码(使用除外)和c ++代码的一部分(我试图从中调用c#方法的方法)。 我还将一些命名空间更改为更通用,并且不包含敏感信息。 c#代码是这样的。 namespace Company.Pins.Bank.Decryption { public class Decrypt { [DllImport(“decryptsn.dll”, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr decryptsn(byte[] InpData); //__declspec(dllimport) char* decryptsn(char* InpData); public static String Decryption(string param2) { byte[] InpData = new byte[255]; InpData = StrToByteArray(param2); return Marshal.PtrToStringAnsi(decryptsn(InpData)); } public static byte[] StrToByteArray(string str) { […]

如何获取regsvr32工具注册的所有非托管dll的列表?

我使用regsvr32来注册和取消注册非托管DLL,以便在我的C#应用​​程序中使用它。 但是我没有在regsvr32工具中看到任何列出所有已注册DLL的参数,那么如何获得所有已注册DLL的列表呢?