如何将DLL访问代码从C++移植到C#
How to port a DLL access code from C++ to C#
我正试图从"Fraps"中获取FPS数据。github上有一个名为LCDHost的项目已经做到了这一点。显然,这是通过挂接"fraps.dll"完成的
我需要将这些代码移植到我正在处理的C#项目中。问题是我不擅长C++,也没有从C#访问非托管dll的任何经验。
如果有人能告诉我如何将这些代码转换为C#,我将不胜感激。
#include <stdio.h>
#include <windows.h>
#include "LH_Text.h"
struct FRAPS_SHARED_DATA {
DWORD sizeOfStruct;
DWORD currentFPS;
DWORD totalFrames;
DWORD timeOfLastFrame;
char gameName[32];
};
FRAPS_SHARED_DATA *(WINAPI *FrapsSharedData) ();
int notify(int n,void* p)
{
if( !n || n&LH_NOTE_SECOND )
{
HMODULE frapsDLL;
FRAPS_SHARED_DATA *fsd;
frapsDLL = GetModuleHandleA("FRAPS32.DLL");
if (!frapsDLL) {
if( setText("N/A") ) callback(lh_cb_render,NULL);
} else {
FrapsSharedData = (typeof(FrapsSharedData)) GetProcAddress(frapsDLL, "FrapsSharedData");
if (!FrapsSharedData) {
if( setText("Needs Fraps 1.9C or later!") ) callback(lh_cb_render,NULL);
} else {
if( setText( "Fraps is running & is the right version." ) ) callback(lh_cb_render,NULL);
fsd = FrapsSharedData();
if( setText(QString::number(fsd->currentFPS) ) ) callback(lh_cb_render,NULL);
}
}
}
return LH_Text::notify(n,p) | LH_NOTE_SECOND;
}
真正让我困惑的是这条
FrapsSharedData = (typeof(FrapsSharedData)) GetProcAddress(frapsDLL, "FrapsSharedData");
我不知道它在C#中的等价物是什么
完整的代码可以在这里找到
使用DllImport属性,它将调用非托管dll。只需从中找到必要的C库调用一个适当的函数。非常有用的例子如下:https://msdn.microsoft.com/en-us/library/aa984739(v=vs.71).aspx
想明白了。以下是我是如何做到的。
class fraps
{
[StructLayout(LayoutKind.Sequential)]
public struct sFraps
{
public int SizeOfStruct;
public int CurrentFPS;
public uint TotalFrames;
public uint TimeOfLastFrame;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public char[] GameName;
};
[DllImport("FRAPS32.dll")]
public static extern IntPtr FrapsSharedData();
public int fpsGet() {
try
{
sFraps fps = (sFraps)Marshal.PtrToStructure(FrapsSharedData(), typeof(sFraps));
return fps.CurrentFPS;
}
catch
{
return -1;
}
}
}
在顶部,您需要
using System.Runtime.InteropServices;
在C#代码中使用非托管DLL比我最初想象的要复杂得多。有一件事我不明白,我们一开始是如何弄清楚灰泥的结构的?
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值