标签: pinvoke

"即使平台相同,也试图加载格式不正确的程序"

我在64位系统上调用32位非托管DLL的函数.我得到的是:

BadImageFormatException:尝试加载格式不正确的程序.(HRESULT异常:0x8007000B)

起初,我将我的项目设置为Any CPU平台,因此我将它们都更改为x86,但此错误仍在发生.这真的是我所知道的唯一解决方案.

DLL没有损坏或任何东西,因为我可以将它们与其他程序一起使用(我没有源代码).我想也许它没有找到依赖,但我检查了,他们都在那里.另外,DllNotFoundException在这种情况下不会抛出一个吗?

我还可以做些什么?在您说"使用64位非托管DLL"之前,让我指出没有一个.;)

.net 64-bit pinvoke 32-bit badimageformatexception

448
推荐指数
11
解决办法
46万
查看次数

在WPF中为窗口打开一个窗口

如何将我的WPF应用程序带到桌面的前端?到目前为止,我已经尝试过:

SwitchToThisWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle, true);

SetWindowPos(new WindowInteropHelper(Application.Current.MainWindow).Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

SetForegroundWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle);
Run Code Online (Sandbox Code Playgroud)

这些都没有Marshal.GetLastWin32Error()成功(说这些操作成功完成,每个定义的P/Invoke属性都有SetLastError=true).

如果我创建一个新的空白WPF应用程序,并SwitchToThisWindow使用计时器调用,它完全按预期工作,所以我不知道为什么它不能在我的原始情况下工作.

编辑:我正在与全球热键一起做这个.

.net c# wpf pinvoke winapi

210
推荐指数
11
解决办法
16万
查看次数

使用UI自动化的Google Chrome访问树缓存问题

当用户在浏览器中向下滚动时,Google Chrome不会刷新辅助功能元素(AutomationElement).

重现它:

  1. 使用以下方式启用渲染器辅助功能: "chrome --force-render-accessibility"或通过设置Global Accessibility at "chrome://accessibility".
  2. 转到http://en.wikipedia.org/wiki/Google
  3. 在UI自动化模式下打开inspect.exe(从Windows Kits),查找"链接到相关文章"元素.
  4. 回到Chrome,向下滚动,直到底部显示"链接到相关文章"
  5. 屏幕上标有"相关文章的链接"元素

我找到了一些可以强制Chrome刷新它的手动解决方案:

  1. 将缩放设置为90%然后将其设置为100%(非常非常难看)
  2. 关闭可访问性,然后打开 chrome://accessibility/

我正在寻找的是能够以编程方式执行这些操作之一,或任何可以使Chrome刷新其缓存树的操作.


我尝试过的:

  • 调整窗口大小 PInvoke/MoveWindow
  • 重绘窗口 PInvoke/Redrawwindow
  • 构建镀铬扩展并按需强制缩放至100%:( chrome.tabs.setZoom(null, 0);工作但闪烁并减慢窗口速度)

这些都没有正常工作.

编辑:在Windows 7下使用Google Chrome 40.XX,41.XX,42.XX,43.XX,44.XX,45.XX,46.XX,47.XX.Dev,48.XX.Dev进行测试.

c# pinvoke accessibility google-chrome ui-automation

155
推荐指数
1
解决办法
4381
查看次数

无法加载DLL(无法找到模块HRESULT:0x8007007E)

我有我需要在我的.NET 4.0应用程序中使用的非托管C++ API代码的DLL库.但我尝试加载我的DLL的每个方法都会出错:

无法加载DLL"MyOwn.dll":找不到指定的模块.(来自HRESULT的异常:0x8007007E)

我已阅读并尝试了我在互联网上找到的severa解决方案.什么都行不通..

我尝试过使用以下方法:

[DllImport("MyOwn.dll",  CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs((UnmanagedType.I4))]
public static extern Int32 MyProIni(string DBname, string DBuser_pass,
    string WorkDirectory, ref StringBuilder ErrorMessage);
Run Code Online (Sandbox Code Playgroud)

当我尝试按照这篇文章和我运行这个例子时(从下载的代码中)它运行没有问题(使用的DLL在bin/debug文件夹中)

我已将我的dll(以及它所依赖的所有文件复制到我的bin文件夹中).

我也试过这种方法,但得到了同样的错误:

[DllImportAttribute(MyOwnLibDllPath, EntryPoint="TMproIni")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern  int MyproIni(string DBname, string DBuser_pass, 
    string WorkDirectory, ref StringBuilder ErrorMessage);
Run Code Online (Sandbox Code Playgroud)

有什么建议?

c# c++ dll pinvoke

105
推荐指数
7
解决办法
31万
查看次数

如何以托管方式在.NET中获取父进程

我正在寻找很多方法来获取.NET中的父进程,但只找到了P/Invoke方式.

c# pinvoke managed process parent

80
推荐指数
4
解决办法
7万
查看次数

什么可能导致P/Invoke参数在传递时出现故障?

这是一个特别在ARM上发生的问题,而不是在x86或x64上.我有这个用户报告的问题,并且能够通过Windows IoT在Raspberry Pi 2上使用UWP重现它.我在使用不匹配的调用约定之前已经看到过这种问题,但是我在P/Invoke声明中指定了Cdecl,我尝试在原生端显式添加__cdecl并获得相同的结果.这是一些信息:

P/Invoke声明(参考):

[DllImport(Constants.DllName, CallingConvention = CallingConvention.Cdecl)]
public static extern FLSliceResult FLEncoder_Finish(FLEncoder* encoder, FLError* outError);
Run Code Online (Sandbox Code Playgroud)

C#结构(参考):

internal unsafe partial struct FLSliceResult
{
    public void* buf;
    private UIntPtr _size;

    public ulong size
    {
        get {
            return _size.ToUInt64();
        }
        set {
            _size = (UIntPtr)value;
        }
    }
}

internal enum FLError
{
    NoError = 0,
    MemoryError,
    OutOfRange,
    InvalidData,
    EncodeError,
    JSONError,
    UnknownValue,
    InternalError,
    NotFound,
    SharedKeysStateError,
}

internal unsafe struct FLEncoder
{
}
Run Code Online (Sandbox Code Playgroud)

C头中的函数(参考)

FLSliceResult FLEncoder_Finish(FLEncoder, FLError*); …
Run Code Online (Sandbox Code Playgroud)

c# windows pinvoke arm uwp

80
推荐指数
1
解决办法
2095
查看次数

如何从WPF中可调整大小的窗口中删除最小化和最大化?

WPF不提供允许调整大小但没有最大化或最小化按钮的窗口的功能.我想能够制作这样一个窗口,以便我可以使用可调整大小的对话框.

我知道解决方案意味着使用pinvoke,但我不知道该怎么称呼以及怎么做.一个搜索pinvoke.net的不转了,在我跳了出来,因为我需要什么什么东西,主要是我敢肯定,因为Windows窗体并提供CanMinimizeCanMaximize性能上它的窗口.

有人可以指点我或提供代码(C#首选)如何做到这一点?

wpf pinvoke user-interface resize

76
推荐指数
4
解决办法
7万
查看次数

pinvokestackimbalance - 如何修复此问题或将其关闭?

我刚从vs2008切换到vs2010.完全相同的解决方案,除了现在每次调用C++ dll都会产生'pinvokestackimbalance'异常.

此异常在2008年不会被触发.我可以完全访问C++ dll和调用应用程序.pinvoke似乎没有任何问题,但是这个问题使调试其他问题变得不可能; IDE经常停下来告诉我这些事情.

例如,这是C#签名:

    [DllImport("ImageOperations.dll")]
    static extern void FasterFunction(
        [MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, //IntPtr inImage, 
        [MarshalAs(UnmanagedType.LPArray)]byte[] outImage, //IntPtr outImage, 
        int inTotalSize, int inWindow, int inLevel);
Run Code Online (Sandbox Code Playgroud)

这是C++方面的样子:

#ifdef OPERATIONS_EXPORTS
#define OPERATIONS_API __declspec(dllexport)
#else
#define OPERATIONS_API __declspec(dllimport)
#endif
extern "C" {


OPERATIONS_API void __cdecl FasterFunction(unsigned short* inArray, 
                                       unsigned char* outRemappedImage,
                                       int inTotalSize, 
                                       int inWindow, int inLevel);

}
Run Code Online (Sandbox Code Playgroud)

vs2010和vs2008之间有什么不同会导致这些异常被抛出?我应该在DllImport指令中添加一组不同的参数吗?

c# c++ pinvoke visual-studio-2010 visual-studio

73
推荐指数
3
解决办法
6万
查看次数

在c#代码中使用c ++ dll中定义的类

我有一个用c ++编写的dll,我需要在我的c#代码中使用这个dll.搜索后我发现使用P/Invoke可以访问我需要的函数,但这些函数是在类中定义的,并使用非静态私有成员变量.所以我需要能够创建这个类的实例来正确使用这些函数.如何才能访问此类以便创建实例?我一直无法找到办法.

我想我应该注意c ++ dll不是我的代码.

c# c++ dll pinvoke

66
推荐指数
3
解决办法
8万
查看次数

如何处理名称超过259个字符的文件?

我正在开发一个应用程序,它遍历某些目录中的每个文件,并对这些文件执行一些操作.其中,我必须检索文件大小和修改此文件的日期.

有些文件全名(目录+文件名)太长,我无法使用.NET Framework FileInfo,限制为MAX_PATH(260个字符).许多Web资源建议通过P/Invoke使用本机Win32函数来访问名称太长的文件.

目前,Win32函数似乎出现了完全相同的问题.例如,对于GetFileAttributesEx270字节的路径,(kernel32.dll)失败,Win32错误3 ERROR_PATH_NOT_FOUND.

可以从Notepad2成功打开同一个文件并使用Windows资源管理器成功显示(但Visual Studio 2010例如由于259个字符限制¹而无法打开它).

当文件路径长度为270个字符时,如何才能访问文件?

笔记:

  • 删除或忽略文件路径长度超过259个字符的文件不是解决方案.

  • 我正在寻找仅与Unicode兼容的解决方案.

  • 该应用程序将在安装了.NET Framework 4的Windows 2008/Vista或更高版本下运行.


¹令人惊讶的是,Microsoft Word 2007失败了,在没有任何软盘驱动器的计算机上抱怨"软盘太小",或者在剩下4 GB RAM时"RAM内存很低",或者最后那个"防病毒软件[...]需要更新".他们有一天会停止显示至少在像Microsoft Office这样的关键产品中出现如此愚蠢无意义的错误吗?

c# windows file-io pinvoke interop

65
推荐指数
6
解决办法
6万
查看次数