大家好,由于我只会C++,现在又一份C#需要做一个小小的改动。。我需要帮助。我从文件中读取了一段内容到Buffer,
这段Buffer是我用C++程序写入的一个结构体。
struct IMAGE_TLS_DIRECTORY32
{
DWORD StartAddressOfRawData;
DWORD EndAddressOfRawData;
DWORD AddressOfIndex;
DWORD AddressOfCallBacks;
DWORD SizeOfZeroFill;
DWORD Characteristics;
} 现在我需要在C#中操作它。根据我查到的一些资料。。我先在C#中定义这样一个结构体:
public struct IMAGE_TLS_DIRECTORY32
{
public fixed uint StartAddressOfRawData;
public fixed uint EndAddressOfRawData;
public fixed uint AddressOfIndex;
public fixed uint AddressOfCallBacks;
public fixed uint SizeOfZeroFill;
public fixed uint Characteristics;
} 然后我想把Buffer转成IMAGE_TLS_DIRECTORY32类型,比如我定义一个 IMAGE_TLS_DIRECTORY32 strctA;
想把Buffer的内容赋给strctA然后通过strctA.StartAddressOfRawData 来给一些变量赋值这可以做到吗?怎么做?我不会写C#代码,有哪位朋友能提供帮助。。
这段Buffer是我用C++程序写入的一个结构体。
struct IMAGE_TLS_DIRECTORY32
{
DWORD StartAddressOfRawData;
DWORD EndAddressOfRawData;
DWORD AddressOfIndex;
DWORD AddressOfCallBacks;
DWORD SizeOfZeroFill;
DWORD Characteristics;
} 现在我需要在C#中操作它。根据我查到的一些资料。。我先在C#中定义这样一个结构体:
public struct IMAGE_TLS_DIRECTORY32
{
public fixed uint StartAddressOfRawData;
public fixed uint EndAddressOfRawData;
public fixed uint AddressOfIndex;
public fixed uint AddressOfCallBacks;
public fixed uint SizeOfZeroFill;
public fixed uint Characteristics;
} 然后我想把Buffer转成IMAGE_TLS_DIRECTORY32类型,比如我定义一个 IMAGE_TLS_DIRECTORY32 strctA;
想把Buffer的内容赋给strctA然后通过strctA.StartAddressOfRawData 来给一些变量赋值这可以做到吗?怎么做?我不会写C#代码,有哪位朋友能提供帮助。。
解决方案 »
- DEV报表大神来吧,请教个问题
- 怎么将参数做方法名使用?
- C#调用C++dll函数,用参数返回值老是出错,我都无奈了
- 请教高手:C#如何实现WinRAR的右键菜单功能(顶有分!)
- 思归等高手请进,如何在WinForm Datagrid使用鼠标选择任意大小的一个区域,马上结贴!!
- DateSet问题,我想将某列中相等的行对应的值加起来……谢谢先~
- 控件的ID动态定义后怎样引用?
- 用DataAdapter和dataSet向数据库中添加记录的问题。大家进来看看。
- 如何重写自定义控件的load事件或init事件???
- 怎样定位web应用程序的位置?
- ReadTimeout属性(高手请进)
- 如何用C#建一个托盘程序
using (BinaryReader br = new BinaryReader(File.Open(fileName, FileMode.Open)))
{
uint StartAddressOfRawData = br.ReadUInt32();
uint EndAddressOfRawData = br.ReadUInt32();
uint AddressOfIndex = br.ReadUInt32();
uint AddressOfCallBacks = br.ReadUInt32();
uint SizeOfZeroFill = br.ReadUInt32();
uint Characteristics = br.ReadUInt32(); }
试试看行不
IntPtr _StructIntPtr = Marshal.AllocHGlobal(_StuctSize);
Marshal.Copy(_LoadBytes, 0, _StructIntPtr, _StuctSize);
object _StructObject = Marshal.PtrToStructure(_StructIntPtr, typeof(IMAGE_TLS_DIRECTORY32));
Marshal.FreeHGlobal(_StructIntPtr); IMAGE_TLS_DIRECTORY32 _Image = (IMAGE_TLS_DIRECTORY32)_StructObject;
如果不能unsafe,就改用Marshal
这个比较麻烦,得先用Marshal的Alloc*申请一块非托管内存,
然后用Marshal.Copy把缓冲区复制过去,然后调用Marshal.PtrToStructure
生成结构体,最后再用Marshal.Free*释放申请的内存.