我试图导出一个简单的测试函数,用于处理一个应用程序(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删除了所有需要导出到的应用程序所需的修改.
有人可以解释一下这是为什么吗?我只是对这两种方法感到好奇.谢谢!
我正在寻找一种方法将鼠标点击发送到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) 我想在自定义控件(而不是用户控件)中实现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)
关于以标准方式执行此操作的任何想法?
我已经看到了帖子,询问有关如何获取,而无需关闭VStudio被刷新的环境变量,但对我来说,我只是想知道我怎么能做出更改,而无需重新启动我的系统.我真的不明白它是如何检测不到新变化的 - 我已经完全确定过程没有闲逛,甚至在重新打开之前使用vcvars32.bat来获取新的更改.我找不到解决方案.我的环境变量可以在其他地方使用(即.%variablename%在cmd.exe中工作).有任何想法吗?
我想改变使用GDI +绘制自身的控件的某些部分的颜色,例如,当某些对象被悬停/点击时.
我怎样才能重新绘制必要的部分?当我只需要对其中一些像素进行更改时,重新绘制数千个像素似乎很糟糕.
具体来说,我已经绘制了1到128个矩形,我将需要在各种事件中重新绘制1到128个矩形.我不想重新绘制128个矩形,只能更改为1-127.
我已经读过在不是绘制事件的地方使用绘图代码是一个坏主意.但是,依靠油漆事件可以做到这一点吗?
我通过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中?
我的主要目标是从程序集中动态执行一个方法,该方法可以调用我自己的程序,但必要时也必须完全卸载程序集.它的目的是成为一个插件系统.