最近的文章列表

PInvoke调用导致堆栈不对称
对 PInvoke 函数HTLib::Usb_DelHtFile的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。把:[DllImport("ht32dll.dll")]public static extern long Usb_DelHtFile(string filename,long mIndex);改成:[DllImport("ht32dll.dll")]public static extern int Usb_DelHtFile(string filename, int mIndex);后来查阅网文(网址:http://hi.baidu
2011/5/14 Comments:
编写C++非托管DLL以及在.NET托管中调用
编写C++非托管DLL以及在.NET托管中调用 新建项目,来到Win32,点击Win32项目输入名称MyVC点击确定。应用程序类型,勾选DLL,点击完成。 MyVC.cpp #include "stdafx.h"#include <stdio.h> extern "C" __declspec(dllexport) int Max(int a,int b){ return a>b?a:b;}extern "C" __declspec(dllexport) int Min(int a,int b){ return a>b?b:a;} //此示例来自CSDNextern "
2011/5/14 Comments:
MSDN中回调函数的讲解及其C#例子:用委托实现回调函数
ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconusingcallbackfunctions.htm回调函数是托管应用程序中可帮助非托管 DLL 函数完成任务的代码。对回调函数的调用将从托管应用程序中,通过一个 DLL 函数,间接地传递给托管实现。在用平台调用调用的多种 DLL 函数中,有些函数要求正确地运行托管代码中的回调函数。本主题将介绍托管函数的元素,并说明如何实现回调函数和从托管代码中调用回调函数。回调函数基础要从托管代码中调用大多数 DLL 函数,可创建该函数的托管定义,然后调用该函数。此过程比较直接。要使用需要回调函数的 DLL 函数,则会有一些附加的步骤。首先,必须在文档中查阅该函数,确定该函数是否需要回调。接着,必须在托
2011/5/14 Comments:
c#调用c++dll时,结构体长度,占位符定义
#region 占位符定义 public struct Byte4 { byte b1, b2, b3, b4; } public struct Byte8 { Byte4 dummy1, dummy2; } public struct Byte16 { Byte8 dummy1, dummy2; } public struct Byte32 { Byte16 dummy1, dummy2; } public struct Byte64 { Byte32 dummy1, dummy2; } public struct Byte100 { Byte64 dummy1; Byte32 du
2011/4/8 Comments:
C#调用C++的dll时汉字出现乱码问题
Win32API.CommonType.USER user = new Win32API.CommonType.USER(); byte[] byt = new byte[37]; #region 给unsafe区域变量赋值 unsafe { byte[] bytUN = System.Text.Encoding.GetEncoding("GB2312").GetBytes(strUserName); for (int i = 0; i < bytUN.Length; i+
2011/4/8 Comments:
C#(C++,dll)结构体数组间的转化之定义结构体和byte数组转结构体
解决C#结构体数组间的转化问题的由来:在写C#TCP通信程序时,发送数据时,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按以下方法实现:(1)解决C#结构体数组间的转化之定义结构体://命名空间 using System.Runtime.InteropServices; //注意这个属性不能少 [StructLayoutAttribute( LayoutKind.Sequential, CharSet=CharSet.Ansi,Pack=1)] struct TestStruct ...{ public int c; /
2011/3/31 Comments:
c#(c++/c DLL)尝试读取或写入受保护的内存,这通常指示其他内存已损坏
C#调用非托管DLL中的API: LONG APIENTRY devwdm_GetImageBuffer(BYTE *pImageMem); 函数功能: 采集一帧RGB24图像到内存 pImageMem: 图像缓冲区指针C#调用: C# code[DllImport("devwdm.dll")]public static extern int devwdm_GetImageBuffer(IntPtr pImageMem);于是报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。求助于大家,根据大家的意见,把API中的 BYTE* 转换到C#中,分别用 byte[] 、IntPtr 、ref byte[]、 ...甚至用unsafe了,可是还是报错,有人说内存不
2011/3/29 Comments:
C#调用C/C++开发的dll方法
方法一:P/Invoke调用非托管代码的方法[DllImport("camnpr.dll")]static extern Int32 Jie(Int32 arg);方法二:LoadLibrary动态调用[DllImport("Kernel32")] publicstaticexternintGetProcAddress(inthandle,Stringfuncname); [DllImport("Kernel32")] publicstaticexternintLoadLibrary(Stringfuncname); [DllImport("Kernel32")] publicstaticexternintFre
2011/3/24 Comments:
查看DLL函数的标识包_无法再Dll中找到名为的入口点
DLL 函数的标识包括以下元素: 函数的名称或序号 实现所在的 DLL 文件的名称 例如,如果指定 User32.dll 中的 MessageBox 函数,需要标识该函数 (MessageBox) 及其位置(User32.dll、User32 或 user32)。Microsoft Windows 应用程序编程接口 (Win32 API) 可以包含每个字符和字符串处理函数的两个版本:单字节字符 ANSI 版本和双字节字符 Unicode 版本。如果不进行指定,CharSet 字段所表示的字符集将默认为 ANSI。某些函数可以有两个以上的版本。 M
2011/3/24 Comments:
C#动态地调用Win32 DLL中导出的函数_C/C++和C#中的数据类型的对应表
关于这种C#中调用Win32 DLL中导出的函数的方法有很多种了,本文做个小结。大致有两种情况:编译时已知DLL文件名和函数名运行时才能获知DLL文件名(函数名)编译时已知DLL文件名这种情况下可以简单的使用Pinvoke机制,使用DllImport如:[System.Runtime.InteropServices.DllImport("kernel32.dll")]public static extern bool Beep(uint freq,uint time);运行时才能获知DLL文件名有两种解决方案:首先,可以想到使用Win32 API中LoadLibrary和GetProcAddress,象在C/C++中一样来动态调用DLL中函数,这里就不细说了;其次,考虑如
2011/3/22 Comments: