我正在尝试使用DllImport以下代码中的属性:
[DllImport("grfinger.dll",EntryPoint="_grstartenroll@4")]
public static extern int startenroll(int context);
Run Code Online (Sandbox Code Playgroud)
获取我使用dumpbin/export的函数名称.当我运行代码时,我得到以下异常:
Unable to find an entry point name '_grstartenroll@4' in DLL 'grfinger.dll'.
我该如何解决这个错误?
在我的代码中,我可以从user32.dll加载"MessageBoxA"并使用它,但如果我尝试加载并使用我的DLL中的函数,我会崩溃.
我的C#代码:
[DllImport("SimpleDLL.dll")]
static extern int mymean(int a, int b, int c);
[DllImport("user32.dll")]
static extern int MessageBoxA(int hWnd,
string msg,
string caption,
int type);
Run Code Online (Sandbox Code Playgroud)
[...]
这很有效
MessageBoxA(0, "Hello, World!", "This is called from a C# app!", 0);
Run Code Online (Sandbox Code Playgroud)
这次崩溃
int mean = mymean(12, 14, 16);
Run Code Online (Sandbox Code Playgroud)
我的C++ DLL代码:SimpleDLL.cpp:
extern "C" _declspec(dllexport) int mymean(int x, int y, int z)
{
return (x + y + z) / 3;
}
SimpleDLL.def:
LIBRARY "SimpleDLL"
mymean
Run Code Online (Sandbox Code Playgroud)
SimpleDLL.dll被复制到与我从C#代码编译的.exe相同的文件夹中.使用依赖性walker,我可以看到加载SimpleDLL.dll的所有必需的DLL都存在.
我们选择以下Win API调用作为示例:
BOOL MessageBeep(UINT uType); // from User32.dll
Run Code Online (Sandbox Code Playgroud)
输入参数是UINT来指定蜂鸣声类型,它可以是32位和64位整数,具体取决于我们称之为的Windows版本(或者我错了吗?).
如果我想从C#调用P/Invoke消息,那么我应用DllImport声明:
[DllImport("User32.dll")]
static extern Boolean MessageBeep(UInt32 beepType);
Run Code Online (Sandbox Code Playgroud)
这个代码C#在Windows x64下运行吗?
我使用P/Invoke调用GetSystemMenu和EnableMenuItem(win32api)来禁用关闭功能.但是,在最小化或最大化我的Windows窗体应用程序后,将重新启用该按钮.
显然,最小化或最大化会导致行为,但如何?我不知道在哪里可以防止这种行为.
我应该阻止最大化和最小化行为,还是IP /调用呼叫的方式有什么特别的错误?加载应用程序(主窗体)后,我会通过单击按钮调用静态方法.
class PInvoke
{
// P/Invoke signatures
[DllImport("user32.dll")]
static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);
// SysCommand (WM_SYSCOMMAND) constant
internal const UInt32 SC_CLOSE = 0xF060;
// Constants used with Add/Check/EnableMenuItem
internal const UInt32 MF_BYCOMMAND = 0x00000000;
internal const UInt32 MF_ENABLED = 0x00000000;
internal const UInt32 MF_GRAYED = 0x00000001;
internal const UInt32 MF_DISABLED = 0x00000002;
/// <summary>
/// Sets the state of the Close (X) button and the …Run Code Online (Sandbox Code Playgroud) 我有很奇怪的行为从C#代码调用SymGetModuleInfo64.我总是得到与Marshal.GetLastWin32Error()的ERROR_INVALID_PARAMETER(87).我已经阅读了很多关于IMAGEHLP_MODULE64结构的频繁更新问题的帖子,我刚刚下载了最新的Windows调试工具(x86),从那个位置加载dbghelp.dll,我很确定它会工作.但是我得到了同样的错误.任何人都指出我这里有什么问题?
IMAGEHLP_MODULE64结构在我的代码中定义如下:
[StructLayout(LayoutKind.Sequential)]
public struct IMAGEHELP_MODULE64
{
//************************************************
public int SizeOfStruct;
public long BaseOfImage;
public int ImageSize;
public int TimeDateStamp;
public int CheckSum;
public int NumSyms;
public SymType SymType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string ModuleName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string ImageName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string LoadedImageName;
//************************************************
//new elements v2
//*************************************************
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string LoadedPdbName;
public int CVSig;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 780)]
public string CVData;
public int PdbSig;
public GUID PdbSig70;
public int …Run Code Online (Sandbox Code Playgroud) 我有一个用C++编写的dll,我想用C#调用它.函数输出outputChar和deadChar,deadChar变量也由C++函数读取.
我试图以不同的方式从C#调用函数,但是我一直得到AccessViolationException:"试图读取或写入受保护的内存.这通常表明其他内存已损坏."
C++ DLL:
extern "C" _declspec (dllexport) int convertVirtualKeyToWChar(int virtualKey, PWCHAR outputChar, PWCHAR deadChar);
Run Code Online (Sandbox Code Playgroud)
C#代码1:
[DllImport("keylib.dll")]
static extern int convertVirtualKeyToWChar(int virtualKey,
StringBuilder output,
StringBuilder deadchar);
Run Code Online (Sandbox Code Playgroud)
C#代码2:
static extern int convertVirtualKeyToWChar(int virtualKey,
out char output,
ref char deadchar);
Run Code Online (Sandbox Code Playgroud) 我尝试了几种方法让MoveFileEx使用DELAY_UNTIL_REBOOT标志而没有成功.注册表中的FileRenameOperations键还显示该方法未正确执行.可能是什么原因?
我这样调用我的MoveFileEx函数:
MoveFileEx(localFile, oldFile, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
Run Code Online (Sandbox Code Playgroud)
我的WINAPI代码如下:
[DllImport("kernel32.dll", EntryPoint = "MoveFileEx")]
internal static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags);
internal enum MoveFileFlags
{
MOVEFILE_REPLACE_EXISTING = 1,
MOVEFILE_COPY_ALLOWED = 2,
MOVEFILE_DELAY_UNTIL_REBOOT = 4,
MOVEFILE_WRITE_THROUGH = 8
}
Run Code Online (Sandbox Code Playgroud)
此应用程序在管理员帐户下运行.这可能是因为我使用的是4而不是0x4或者是64位问题吗?谢谢!
编辑:操作返回false,错误代码为3.
我有一个采用三个参数的API
BOOL GetServerName (int index, LPSTR Buffer, int BufSize);
Run Code Online (Sandbox Code Playgroud)
我如何在C#中使用此方法
LPSTR的等效性是什么?
我想获得当前鼠标指针的速度,我想设置它.
为了得到它,我使用
Public Declare Function SystemParametersInfo Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uAction As Int32, ByVal uParam As Int32, ByRef lpvParam As Int32, ByVal fuWinIni As Int32) As Int32
Dim Result As Int32 = 0
Dim iSuccess As Integer = SystemParametersInfo(SPI_GETMOUSESPEED, 0, Result, 0)
Run Code Online (Sandbox Code Playgroud)
设置它,我用
Public Declare Function SystemParametersInfo Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uAction As Int32, ByVal uParam As Int32, ByVal lpvParam As Int32, ByVal fuWinIni As Int32) As Int32
Dim iVal As Integer = 10
Dim iSuccess As Integer …Run Code Online (Sandbox Code Playgroud) 围绕与ASP.net vNext/Core CLR的非托管代码互操作的故事(如果有的话)是什么?
关键位(DllImport和朋友)似乎存在以允许非托管代码互操作,但打包和部署之类的东西如何在这种情况下工作?vNext/CoreFX中的基本构建工件不再是一个程序集,而是一个NuGet包.那么在这种情况下,我们如何使新的project.json系统工作,以便我们P/Invoking的非托管dll也包含在生成的NuGet包中?
或者我在谈论尚未考虑的情景(或更令人失望,不会发生)?