在一个C#文件中,我有一个
class Archiver {
[DllImport("Archiver.dll")]
public static extern void archive(string data, StringBuilder response);
}
Run Code Online (Sandbox Code Playgroud)
字符串数据是一个输入,StringBuilder响应是函数写入的东西
归档函数原型(用C编写)如下所示:
void archive(char * dataChr, char * outChr);
Run Code Online (Sandbox Code Playgroud)
它在dataChr中接收一个字符串,然后执行一个
strcpy(outChr,"some big text");
Run Code Online (Sandbox Code Playgroud)
从C#我称之为:
string message = "some text here";
StringBuilder response = new StringBuilder(10000);
Archiver.archive(message,response);
Run Code Online (Sandbox Code Playgroud)
这是有效的,但问题是,你可能会看到我给StringBuilder大小赋值,但是归档函数可能会返回一个比我给我的StringBuilder大小更大的文本.有任何解决这个问题的方法吗?
我在非托管DLL函数swe_calc_ut上使用P/invoke.
int swe_calc_ut(double tjd_et, int ipl, int iflag, double *xx, char *serr)
Run Code Online (Sandbox Code Playgroud)
参数xx是"用于存储结果的6个双精度数组",参数serr是"返回错误消息的字符串"
我的c#代码如下.
[DllImport("swedll32.dll")]
private static extern int swe_calc_ut(double tjd_ut, int ipl, int iflag, out double[] xx, out char[] serr);
double jul_day_UT=22000;
int p=3;
int iflag=64 * 1024;
double[] arr;
char[] serr;
int x = swe_calc_ut(jul_day_UT, p, iflag , out arr, out serr);
Run Code Online (Sandbox Code Playgroud)
现在当我执行函数swe_calc_ut函数时,我得到错误"抛出类型'System.ExecutionEngineException'的异常.".我是P/invoke的新手,所以我可能犯了一个愚蠢的错误.我认为它必须是数组,因为早些时候我偶然通过值传递它我没有得到错误.我非常感谢你的帮助.
嘿伙计们,我正在尝试向游戏发送消息(自动化文本命令),问题是我无法弄清楚如何使用spy ++中的信息来编写C#sendmessage函数.
我能够使用spy ++来获取
00220540 S WM_SETCURSOR hwnd:0024052C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
任何人都可以提供这意味着什么的细分,以及如何在c#中将消息发送到游戏中?
编辑:我发现我正在查看错误的过程.我没有看javaw.exe,而是看着实际的游戏.这是按t的代码:
<00919> 0038062A WM_INPUT nInputCode:RIM_INPUT hRawInput:189E0973
<00920> 0024052 P WM_KEYUP nVirtKey:'T' cRepeat:1 ScanCode:14fExtended:0fAltDown:0fRepeat:1fUp:1
Run Code Online (Sandbox Code Playgroud)
谢谢,
马克斯
这是Delphi DLL代码:
library Project2;
uses
SysUtils,
Classes;
{$R *.res}
function SimpleConv(const s: string): string;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(s) do
if Ord(S[i]) < 91 then
Result := Result + S[i];
end;
function MsgEncode(pIn: pchar; InLen: Integer; var pOut: pchar; var OutLen: Integer): Boolean; stdcall;
var
sIn: string;
sOut: string;
begin
SetLength(sIn, InLen);
Move(pIn^, sIn[1], InLen);
sOut := SimpleConv(sIn); // Do something
OutLen := Length(sOut);
GetMem(pOut, OutLen);
Move(sOut[1], pOut^, OutLen);
Result := OutLen …Run Code Online (Sandbox Code Playgroud) 我有一个Visual Studio 2008 C#.NET 3.5应用程序P/Invokes一个接受文件句柄作为参数的本机方法.最初,我只是使用FileStream.SafeFileHandle.DangerousGetHandle()来获取文件句柄.但是,在启用FX COP之后,我收到了CA2001的警告.因此,经过一番研究后,我发现了"约束执行区域".这对我来说是新的,我还没有看到很多关于它的信息.我希望有经验的人可以看看并验证我是否已正确完成此操作.
class MyClass
{
public static bool Write(string filename)
{
using (var fs = new System.IO.FileStream(filename,
System.IO.FileMode.Create,
System.IO.FileAccess.Write,
System.IO.FileShare.None))
{
bool got_handle;
bool result;
System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions();
try { }
finally
{
fs.SafeFileHandle.DangerousAddRef(ref got_handle);
result = NativeMethods.Foo(fs.SafeFileHandle.DangerousGetHandle());
if (got_handle)
fs.SafeFileHandle.DangerousRelease();
}
return result;
}
}
}
internal sealed class NativeMethods
{
[DllImport("mylib.dll",
EntryPoint = "Foo",
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Unicode,
ExactSpelling = true,
SetLastError = true)]
public static extern bool Foo(IntPtr hFile);
}
Run Code Online (Sandbox Code Playgroud)
谢谢,PaulH
我正在尝试自动化在启动时创建GUI窗口但没有用户交互的应用程序,但我无法弄清楚如何隐藏实际窗口.
我尝试过使用ProcessStartInfo:
Process.Start(new ProcessStartInfo {
UseShellExecute = false,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
// other properties here
});
Run Code Online (Sandbox Code Playgroud)
但窗口仍然显示出来.
我也试过旋转等待窗口存在,然后隐藏它:
while (process.MainWindowHandle == IntPtr.Zero) {}
ShowWindowAsync(process.MainWindowHandle, SW_HIDE);
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这使得窗口闪烁大约1/16秒左右,如果可能的话,我想避免使用它.
我目前的想法是创建一个钩子,但我不确定抓什么钩子,也不确定它是否会起作用.
有小费吗?
我找到了关于获取文件甚至文件扩展名的系统映像的各种文章.我有以下方法,用于获取小型16x16和大型32x32图像.
// DLL Import
[DllImport("shell32")]
private static extern IntPtr SHGetFileInfo(
string pszPath,
uint dwFileAttributes,
ref SHFILEINFO psfi,
uint cbFileInfo,
uint uFlags);
// Constants/Enums
private const int FILE_ATTRIBUTE_NORMAL = 0x80;
private enum SHGetFileInfoConstants : int
{
SHGFI_ICON = 0x100, // get icon
SHGFI_DISPLAYNAME = 0x200, // get display name
SHGFI_TYPENAME = 0x400, // get type name
SHGFI_ATTRIBUTES = 0x800, // get attributes
SHGFI_ICONLOCATION = 0x1000, // get icon location
SHGFI_EXETYPE = 0x2000, // return exe type
SHGFI_SYSICONINDEX = 0x4000, // get …Run Code Online (Sandbox Code Playgroud) 我正在尝试在C#webbrowser控件和选项卡中自动填充值,然后输入并向上和向下按以在字段中移动.
这是我的PInvoke和包装函数.我使用Spy ++在Internet Explorer中获取这些内容.有没有人看到我的定义有什么问题?我想使用Send和Post消息而不是SendInput,因为我不想要关注窗口...
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
const uint WM_KEYDOWN = 0x0100;
const uint WM_KEYUP = 0x0101;
const uint WM_CHAR = 0x0102;
const int VK_TAB = 0x09;
const int VK_ENTER = 0x0D;
const int VK_UP = 0x26;
const int VK_DOWN = 0x28;
const int VK_RIGHT = 0x27;
//According to SPY++ in IE
//ENTER key is
// P …Run Code Online (Sandbox Code Playgroud) 如果单击其所有者窗口,则标准Windows对话框将闪烁.效果类似于激活和停用窗口.
然而,当我在对话框上实现自定义窗口边框时,我无法弄清楚何时应该闪烁窗口.Windows不会为我闪烁对话框.
这是我试过的:
我看到所有消息都发送给所有者和对话框,但无法找到任何仅用于告诉窗口闪烁的消息.
我将Spy ++挂钩到默认的Windows对话框中,但也无法找到"flash"消息.
在WinUser.h中查找我找不到"flash"消息,所以我假设它是指定了lParam和wParam的一个或多个消息的某种组合.
有没有人有这方面的经验,或者也许可以指向一些解释这个的页面?任何想法都值得赞赏,因为我已经在这个问题上工作了好几个月了.
编辑
在回复评论时,以下是我目前使用的代码:
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == 0x0020)
{
if ((short)((long)lParam & 0xffff) == (-2))
{
short hiword = (short)((((long)lParam) >> 16) & 0xffff);
if (hiword == 0x0201 || hiword == 0x0204)
Flash(); // My function which simulates a window flash
}
}
return IntPtr.Zero;
}
Run Code Online (Sandbox Code Playgroud) 我有C#的问题.我试图调用以下C++方法.
void SetPropertyInfoList(int count, ref AfwPropertyInfo propertyInfo);
Run Code Online (Sandbox Code Playgroud)
我想用x AfwPropertInfo结构创建一个内存块.我不知道怎么在内存中直接跟在一起.
有谁能够帮我?