如何将win32应用中的c++方法的地址传递给带有Action delegate参数方法的c#方法?
我使用A win32 使用 c#library . c#library 具有一种方法,其中Action委托是一个参数,如下所示: public NetSocket(Action action) 我在Win32应用程序中使用REF类,其方法与Action委托签名匹配. 在上面列出的NetSocket方法中,我如何准确地将此方法作为 Action 参数? ben您的解决方案似乎有效,但是匹配^ System:Sting^输入参数 win32应用程序中的动作委托方法 String String输入参数在 c#代码中. C#代码中的动作委托使用String作为输入参数,而win32代码尝试使用System::String^匹配的操作委托方法将其匹配,但这不起作用. //Win 32 App- void ServerClass::ActionMethod(int iCommand, int iClientIndex, Sy
8 2024-04-26
编程技术问答社区
为什么C#将我的颜色结构改为ValueType?
我在C ++ CLI中定义了以下代码. 但是,当我想将SetColor称为第一个参数时,该参数应该显示为System.Drawing.Color;出现为ValueType. 这也让我将任何变量传递到其中.无论是Color是否. [System::Runtime::CompilerServices::ExtensionAttribute] public ref class MyExtensions abstract sealed { public: [System::Runtime::CompilerServices::ExtensionAttribute] static System::String^ SetColor(System::String^ in, System::Drawing::Color^ ext) { return gcnew System::String("{") + ext->R.To
10 2024-04-26
编程技术问答社区
Visual Studio C#中的文本框验证
我是Visual Studio和C#的新手 我正在使用以下对象: 输入值的Texbox 链接到文本框以验证数据的验证事件. 一个按钮采取行动 单击与按钮关联的事件. 问题是我无法检查框中的值是否有效,并防止按钮中的单击事件发生.换句话说,如果内容不有效,请不要采取行动. 这是我的代码. public partial class mainForm : Form { public mainForm() { InitializeComponent(); } private void addButton_Click(object sender, EventArgs e) { // I need to check if the content is valid before adding it to the form ListViewItem item = new ListViewItem
16 2024-04-26
编程技术问答社区
在c# exe中创建命名的Mutex并在c++中访问它的dll
我在C#中有两个EXE,另一个是VC ++ EXE.这两个EXE都需要访问文件. 所以我打算在C#中创建一个命名的Mutex. VC ++如何访问此名称sutex.任何人都可以给我这个 的示例代码吗 解决方案 C ++代码中的类似内容: HANDLE hMutex = CreateMutex(NULL, FALSE, name); if (hMutex == NULL) { // Handle failure. } 如果您需要知道二线是否已经存在,请检查hMutex != null && GetLastError() == ERROR_ALREADY_EXISTS. 在同一会话中两个过程的情况下,您将获得的默认ACL应该可以,否则您需要设置适当的ACL. 其他解决方案 如果您在C#中创建了utex,则您的C ++代码将是: HANDLE mutexHandle = OpenMutex(SYNCHRONIZE,0,"NameOfYourMute
10 2024-04-26
编程技术问答社区
参数中的数据值正在被复制到其他参数中 c++, c#
在C ++中我要导出的方法是: __declspec(dllexport) int __thiscall A::check(char *x,char *y,char *z) { temp=new B(x,y,z); } 在C#中我正在导入这样的方法: [DllImport("IDLL.dll", CallingConvention=CallingConvention.ThisCall, ExactSpelling = true, EntryPoint = "check")] public static extern int check(string x, string y, string z); 我在C#中称此方法为此,并传递值: public int temp() { string x="sdf"; string y="dfggh"; string z="vbnfg"; int t; t=Class1.check(x,y,z)
12 2024-04-26
编程技术问答社区
在某些电脑中无法运行c#应用程序(使用c++ dll)。
我们创建了一个C#应用程序,该应用程序称为C ++ DLL(SDBM.DLL).除某些PC以外,它在大多数PC中都可以正常工作. DLL是使用VC ++ 2008创建的,并且在VC#2005中完成了应用程序.以下是从C#应用程序调用DLL函数时发生的错误. . 一台PC中发生的错误如下 ================================= 无法加载sdbm.dll:此应用程序由于应用程序配置不正确而无法启动.重新安装应用程序可能会解决此问题(Hresult:0x800736b1的例外) 在第二个PC中发生错误 ================================= 错误签名 appName:app.exe appver:1.0.0.0 modname:msvcr90.dll modver:9.0.30729.4148偏移:0002FC96 任何帮助将不胜感激 解决方案 正如其他人在评论中已经说明的那样,您的s
8 2024-04-25
编程技术问答社区
如何用C#共享Visual C++ DLL中的一个类?
我在C ++上编写了我的程序,并将其导出为DLL.我有一个C#WPF GUI,我想导入DLL进行处理. 我是C#的新手.如何在C#中使用C ++类?我知道我不能只使用.h文件. 因为我在c ++中使用了指针,所以我无法使用指针.这就是为什么我感到困惑.像在C ++中一样,我使用char*而不是string,我需要返回double*以获取大量double数据以及类似的数据. 解决方案 有多种方法: 如果它是com dll,则可以生成您可以使用C ++/CLI来构建创建.NET组件,该组件在本机上加载和调用方法. 要解决您的其他问题,是的,您可以在C#中使用指针.如果您具有具有double*参数的函数,则可以在C#中声明该函数: [DllImport("Your.DLL")] private static extern unsafe void DoProcessing(double* data, int dataSize); 您需要确保在C#项目的"
10 2024-04-24
编程技术问答社区
通过反向PInvoke向C#方法传递一个字节指针
过去,我已经将一个字节数组从C#方法传递给了不受管理的C ++函数.我现在正在尝试将指针传递给从C ++方法的类型Unsigned Char的缓冲区,然后使用反向PINVOKE回到C#方法,该方法使用回调返回C#代码.我尝试了几个不同的想法 - 例如通过参考字节,字节 *和INTPTR进行第二个论点,但它们似乎都没有用.这是我使用intptr的测试代码: c#代码: namespace TestPInvoke { class Program { static void Main(string[] args) { foo f = new foo(); f.DispMsg(); } } unsafe public class foo { public delegate void callback(int NumBytes, IntPtr pBuf);
8 2024-04-24
编程技术问答社区
将C++数组返回给C#
我正在尝试一个小型Interop应用程序,其中我正在调用C#中的一些C ++方法.我有一个非常基本的示例,用于调用方法并返回整数,该整数工作正常. Interopapp.h #ifdef DLLFUNCTIONEXPOSETEST_EXPORTS #define DLLFUNCTIONEXPOSETEST_API __declspec(dllexport) #else #define DLLFUNCTIONEXPOSETEST_API __declspec(dllimport) #endif extern "C" DLLFUNCTIONEXPOSETEST_API int fnSumofTwoDigits(int a, int b); interopapp.cpp #include "stdafx.h" #include "DLLFunctionExposeTest.h" BOOL APIENTRY DllMain( HMODULE hModule,
8 2024-04-24
编程技术问答社区
找不到PInvoke DLL-BUG?
我有Windows Mobile GPS第三方应用程序.也就是C ++代码,该代码包含GPS自动启用/禁用设施. 我想做DLL.我也做到了.当用户单击发票(C#代码)GPS(C ++)时. 这是我的源代码gps.cpp extern "C" //No name mangling __declspec(dllexport) #include "GPS.h" #include "stdafx.h" #include "RF PWR.h" #include "RF PWRDlg.h" #include "widioctl.h" #ifdef _DEBUG #define new DEBUG_NEW #endif void CaptureGPS() { HANDLE hDrv = CreateFile(TEXT("FN
12 2024-04-23
编程技术问答社区
如何才能获得鼠标滚轮的垂直滚动率
我目前正在开发一个自定义控件,并且为了实现垂直滚动,我希望能够获取配置的垂直滚动率(Depical "此处). 我将使用此设置通过[x]行数. 将控件移动. 解决方案 您可以从 systemparametersinfo SPI_GETWHEELSCROLLLINES. 垂直鼠标车轮时检索滚动线的数量 被移动了. PVPARAM参数必须指向UINT变量 接收行数.默认值为3.
10 2024-04-23
编程技术问答社区
如何使用ASF Writer使WMV压缩得更快?有什么提示吗?
我使用ASF Writer将RAW AVI文件压缩为WMV. 我非常需要更快地进行压缩. 关于如何实现这一目标有任何提示和最佳实践?掉落/降低索引撞击?任何隐藏压缩参数吗? 文件仅包含RGB/24BITS格式的视频,视频流的压缩级别为200kbps和2000kbps. 任何配置提示(使用C ++,C#,Delphi等) 这是配置WMV Writer的代码的部分(使用DSpack). function CreateWMVWriter(VideoQuality, AudioQuality: Cardinal; videoInfo: PVideoInfoHeader; audioInfo: PWaveFormatEx; hasAudio: Boolean): IBaseFilter; const PROFILE_NAME = 'WMV AutoProfile'; // BUFFER_WINDOW = $FFFFFFFF; // auto buffer BU
10 2024-04-23
编程技术问答社区
混合使用c#和vc++
我有一个C#的代码段,我一直在尝试转化为VC ++,但是我遇到了一些困难.因此,我想知道是否有可能或建议混合C#和VC ++;也就是说,我可以从VC ++和反之亦然调用我的C#函数.如果是这样,有窍门吗?如果不是,为什么? 解决方案 从C#调用C ++代码非常容易,您应该能够在PinVoke和其他类型的Interop上找到大量文章. 用于从C ++调用您的C#代码 - 如果您的C ++应用程序是管理的,则应该能够直接从C ++应用程序引用C#组件并正常使用. 如果未管理YPU C ++代码,则您需要使用某种类型的Interop来允许您的C ++汇编调用C#代码,这是唯一的方法,即Springs to Springs to Springs是com. 尝试其中一些链接以获取有关与C#Interop Interop的更多信息: 其他解决方案 如果要混合两者,我将从C#开始为基本项目,然后在您的C#项目中注册一个未管理的(C ++)DLL .这样,您可以将托管C
14 2024-04-23
编程技术问答社区
在C#串口中超时
我正在使用C#串行端口库与传感器和PC通信. 即使其中有数据,我也经常与SerialPort.Read()方法进行超时.我使用串行嗅探器检查我正在接收到端口的所有数据包,但一些.NET并未将它们全部挑选出来.我正在阅读字节,并且我收到的字节比串行端口缓冲区大小少2112.我尝试了多件事,现在考虑使用本机C/C++并在C#中调用它.有人可以在C#中分享更多想法或使用的本机C/C++代码. 解决方案 以波特率460800至921600 运行 这些是非常奇怪的波特率,相当高.显然,您没有使用DataReceived事件,因此它会变得相当重要,因此您多久调用read()方法.花点时间做其他事情,包括Windows认为需要做一些更重要的事情,而将上下文切换远离线程,并且接收缓冲区将迅速溢出.不实现serialport.errearceived事件是一个标准错误,因此您只是看不到这些溢出,您所看到的只是缺少数据. 在C ++中编写此代码非常不可能减轻.串行端口只有一个API,S
10 2024-04-23
编程技术问答社区
boost::asio 无法干净利落地关闭 TCP 连接
我正在尝试实现一个简单的HTTP服务器.我能够将HTTP响应发送给客户端,但问题是,在Firefox上,我遇到了"连接重置"错误. IE也失败了,虽然Chrome可以完美地工作并显示我在响应中发送的HTML. 如果我触发了我的服务器,则在响应后,我会收到"连接丢失"消息.因此,我得出的结论是,连接无法正确关闭.以下是代码的重要片段. 类TCPSERVER-这会启动受体(boost :: asio :: ip :: ip :: tcp :: cactor)对象. void TCPServer::startAccept() { TCPConnection::pointer clientConnection = TCPConnection::create(acceptor.io_service()); acceptor.async_accept(clientConnection->getSocket(), boost::bin
14 2024-04-23
编程技术问答社区
如何在 MSVC 中启用 SSE4.1 和 SSE3(但不包括 AVX
我试图使用MSVC启用不同的SIMD支持. 有一个页面谈论启用一些simd,例如sse2,avx,avx2 但是,它没有提及如何启用其他SIMD优化,例如SSE4.1,SSE4.2,SSE3 是否可以在不启用AVX的情况下启用这些? 另外,在MSVC2017/Arch中看起来不再支持/需要SSE2,我可以假设SSE3/sse4.1/sse4.2默认启用了吗? 解决方案 显然您可以以/d2...选项的方式传递/arch:选项.像/d2archAVX. /d2archSSE42是这样接受的(而不是SSE41或SSE3). @peter在评论中指出了/d2archSSE42有所作为的情况: https://godbolt.org.org.org/z/esjw4vtne 其他解决方案 VC ++编译器的智能不如您想象的.这些设置是如何工作的. 当您构建32位代码并启用SSE1或SSE2时,它启用自动矢量化到各自的说明集. 当您构建64位代码时,
20 2024-04-22
编程技术问答社区
滚动条的理念
可能的重复: 滚动条的哲学 请假设我想设计自己的文本编辑器.就像记事本一样. 不使用任何 RichTextBox 或C ++中的编辑,例如. 主句柄只是C ++中的一个窗口或C#中的UserControl. 这个问题是在这里滚动选项,用户时我该如何执行滚动 在打字. 我的意思是在这里垂直滚动. C ++ Windows或 C#用户控件? 我是否应清除(usercontrol或window)当用户到达(USERCONTROL或window)末尾时窗口)? 用拇指或手持滚动滚动呢?我如何找到滚动的文本位置? 解决方案 在这种情况下,我对语言采取了类似的态度.考虑您的听众和常见的使用模式 - 这将使您朝着正确的方向发展.它可能不会给您哲学,但是您将能够做出最重要的决定. 因此,查看其他文本编辑器,并确定用户对什么以及用户期望的东西.使用Microsoft Word或Visual Studio作为指南将是一个非常安全的赌注.偏离标准实践的风险更大.如果您想尝试激
6 2024-04-22
编程技术问答社区
将派生类 shared_ptr 作为参数传递给需要基类 shared_ptr 的函数
我只是通过对项目进行大规模的重构来添加基类代替现在派生的上述基类的类别(因为我想要更多的"类型"此类的"类型"). 我的问题是,某些实用程序函数将原始a类引用为共享_ptr,因此函数声明如下: void UtilityClass::func(shared_ptr &a); ,但是现在我有了新的B类B,并且A是从B派生的(以及来自B的新类C) A或C到现在声明的功能: void UtilityClass::func(shared_ptr &b); 如果我尝试通过: shared_ptr a; utilclass.func(a); 我遇到了一个编译时间错误,说(释义): 无法将参数1从'std :: shared_ptr '转换为 'std :: shared_ptr ' 但是我不确定我还如何解决此问题,func()将a,b或c实例添加到std :: shared_ptr values的vector. 感谢您的时间.
14 2024-04-22
编程技术问答社区
如何创建C#事件来处理来自PostMessage()的MFC Windows消息?
我使用Winsock有一个托管的C ++ DLL.接收到它通过Postmessage()将自定义消息发送给CWND *.当不受管理的C ++调用时,这可以正常工作.使用此代码施工后,目标CWND *在C ++类中注册: // Registers a window (CWnd *) to receive a message when a valid // incoming data packet is received on this UdpRetrySocket. void CUdpRetrySocket::RegOnReceive(CWnd *i_pOnReceiveWnd, UINT i_RecvMsgId = WM_USER_RECV_DATA_AVAIL) { m_pOnReceiveWnd = i_pOnReceiveWnd; m_RecvMsgId = i_RecvMsgId; } 这是将消息发布到CWND * 的代码 // If there
10 2024-04-22
编程技术问答社区
在创建的 VS 2010 安装程序中不断弹出 Visual C++ 2010 运行库前提条件
我创建了一个使用Visual Studio 2010版本10.0.40.219.1 Sp1 rel的安装程序.我的应用程序是为X86构建/编译的,需要VC ++运行时库.因此,设置项目由VC ++运行时库配置为先决条件. 每次我运行安装程序时,我都会获得弹出窗口"以下组件将安装在您的计算机上". " Visual C ++ 2010运行时库(x86)".它第一次预期安装ASA.第二次也是随后的时间,它询问我是维修还是删除VC ++ 2010. 此弹出窗口仅应显示一次,第一次发现不安装VC ++重新分布. 有人看过吗?有人知道我如何解决这个问题? 解决方案: 我接受的答案给了我解决问题所需的内容.这是我为解决此问题所做的详细信息,实际上很简单.我编辑了文件: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\vcredist_x86\product.xml
18 2024-04-22
编程技术问答社区