小编min*_*ina的帖子

使用extern c和dllexport vs模块定义的stdcall名称修改(msvc ++)

我试图导出一个简单的测试函数,用于处理一个应用程序(fyi:mIRC),它将调用约定指定为:

int __stdcall test_func(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause)
Run Code Online (Sandbox Code Playgroud)

现在,要从应用程序中调用它,我将使用test_func,但我注意到由于名称错误,它并不像我想象的那么简单.

通过类似的主题,我已经了解到将extern"C"__declspec(dllexport)结合使用是一种等效的(某种程度上)方法,可以将重整数据删除到模块定义(.def).但是,当使用extern/dllexport方法时,我的函数(作为示例)始终是_test_func @ numbers,而.def删除了所有需要导出到的应用程序所需的修改.

有人可以解释一下这是为什么吗?我只是对这两种方法感到好奇.谢谢!

c++ name-mangling stdcall dllexport visual-c++

15
推荐指数
2
解决办法
1万
查看次数

什么可能导致PostMessage发送的鼠标点击被忽略?

我正在寻找一种方法将鼠标点击发送到Windows上的后台应用程序(即通过句柄),我用来确认我的代码工作的测试窗口接受并处理点击,但我的目标应用程序没有(尽管间谍++)显示消息).

可能是什么导致了这个?是否有解决方法?

这是我正在使用的C#代码.

public enum WMessages : int
{
    WM_LBUTTONDOWN = 0x201,
    WM_LBUTTONUP = 0x202,

    WM_KEYDOWN = 0x100,
    WM_KEYUP = 0x101,

    WH_KEYBOARD_LL = 13,
    WH_MOUSE_LL = 14,
}

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern int PostMessage(HandleRef hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

public void SendClick(WMessages type, Point pos)
{
    switch(type)
    {
        case WMessages.WM_LBUTTONDOWN:
            PostMessage(new HandleRef(null, this.process.MainWindowHandle),
                (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1,
                (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF)));
            return;
        case WMessages.WM_LBUTTONUP:
            PostMessage(new HandleRef(null, this.process.MainWindowHandle),
                (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1,
                (IntPtr)((pos.Y << 16) …
Run Code Online (Sandbox Code Playgroud)

c# c++ mouse postmessage mouseclick-event

5
推荐指数
0
解决办法
9411
查看次数

如何实现自定义控件的AutoSize属性?

我想在自定义控件(而不是用户控件)中实现AutoSize属性,以使其行为类似于在设计模式下实现AutoSize(ala CheckBox)的其他标准.NET WinForms控件。

我已经设置了属性,但是控件在设计模式下的行为方式困扰着我。它仍然可以调整大小,这没有意义,因为视觉调整大小没有体现在我实现的AutoSize和Size属性中。

当AutoSize为true时,标准.NET控件不允许在设计模式下调整大小(甚至显示调整大小的句柄)。我希望我的控件以相同的方式运行。

编辑:我可以使用SetBoundsCore()重写来工作,但是当AutoSize设置为true时,它在视觉上没有限制调整大小,它具有相同的效果;该功能是等效的,但感觉不自然。

protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{
    if (!this.auto_size)
        this.size = new Size(width, height);
    base.SetBoundsCore(x, y, this.size.Width, this.size.Height, specified);
}
Run Code Online (Sandbox Code Playgroud)

关于以标准方式执行此操作的任何想法?

.net c# custom-controls autosize winforms

5
推荐指数
2
解决办法
3807
查看次数

如何在不重新启动系统的情况下使Visual Studio了解新的环境变量

我已经看到了帖子,询问有关如何获取,而无需关闭VStudio被刷新的环境变量,但对我来说,我只是想知道我怎么能做出更改,而无需重新启动我的系统.我真的不明白它是如何检测不到新变化的 - 我已经完全确定过程没有闲逛,甚至在重新打开之前使用vcvars32.bat来获取新的更改.我找不到解决方案.我的环境变量可以在其他地方使用(即.%variablename%在cmd.exe中工作).有任何想法吗?

environment-variables visual-studio visual-c++

4
推荐指数
1
解决办法
6613
查看次数

如何防止GDI +重新绘制油漆上的所有内容?

我想改变使用GDI +绘制自身的控件的某些部分的颜色,例如,当某些对象被悬停/点击时.

我怎样才能重新绘制必要的部分?当我只需要对其中一些像素进行更改时,重新绘制数千个像素似乎很糟糕.

具体来说,我已经绘制了1到128个矩形,我将需要在各种事件中重新绘制1到128个矩形.我不想重新绘制128个矩形,只能更改为1-127.

我已经读过在不是绘制事件的地方使用绘图代码是一个主意.但是,依靠油漆事件可以做到这一点吗?

c# gdi+

3
推荐指数
1
解决办法
552
查看次数

将程序集加载到新的AppDomain以进行静态类/方法调用时出现问题

我通过C#执行.NET程序集时遇到了一些重大问题.我想从静态类调用静态方法(Main).我让它在当前域中工作,但显然我无法从那里卸载程序集.

首先,我尝试创建一个新的AppDomain:

AppDomain domain = AppDomain.CreateDomain("PluginDomain");
Run Code Online (Sandbox Code Playgroud)

由于我的主要问题是解析我正在尝试加载的程序集,我试图挂钩AssemblyResolve事件:

domain.AssemblyResolve += new ResolveEventHandler(this.OnAssemblyResolve);
Run Code Online (Sandbox Code Playgroud)

但是,我得到一个关于序列化的错误(即这个类).

我已成功加载一个汇编文件,它恰好位于BaseDirectory中,只需使用:

domain.Load("Assembly1");
Run Code Online (Sandbox Code Playgroud)

但有问题的程序集位于BaseDirectory的两个子目录中,即.BaseDirectory\dir1\dir2\Assembly2.dll - 当使用带有字符串程序集名称的domain.Load()(将PrivateBinPath安装到正确的子目录位置)时以及使用带有程序集字节的domain.Load()时,我得到FileNotFoundException (来自File.ReadAllBytes()).

我知道AppDomain.Load()已被删除,但它似乎是唯一可用的方法,考虑到我不想强制包含静态方法的类是非静态和可实例化的.

无论如何,我该怎么做才能确保汇编文件正确加载到新的AppDomain中?

我的主要目标是从程序集中动态执行一个方法,该方法可以调用我自己的程序,但必要时也必须完全卸载程序集.它的目的是成为一个插件系统.

.net c# appdomain assembly-resolution .net-assembly

2
推荐指数
1
解决办法
2743
查看次数