我正在尝试编写一个销售点系统,允许"现金抽屉"附件.手册中提供了打开现金抽屉的代码(使用IOCTL以C++编写).由于我在C#.NET中编码,是否可以在C#中执行类似的操作,或者我是否必须编写一些非托管代码?
我能从C#中获得"\\.\ ADVANSYS"的句柄吗?我需要使用DLLImport吗?
如果有人能指出我正确的方向,我将不胜感激.
// IOCTL Codes
#define GPD_TYPE 56053
#define ADV_OPEN_CTL_CODE CTL_CODE(GPD_TYPE, 0x920, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define ADV_STATUS_CTL_CODE CTL_CODE(GPD_TYPE, 0x900, METHOD_BUFFERED, FILE_ANY_ACCESS)
void OpenDrawer(UCHAR uWhichDrawer) // uWhichDrawer = 1 => CD#1, uWhichDrawer = 2 => CD#2
{
HANDLE hFile;
BOOL bRet
UCHAR uDrawer = uWhichDrawer;
// Open the driver
hFile = CreateFile(TEXT("\\\\.\\ADVSYS"),
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (m_hFile == INVALID_HANDLE_VALUE)
{
AfxMessageBox("Unable to open Cash Drawer Device Driver!");
return;
}
// Turn on the …Run Code Online (Sandbox Code Playgroud) 我在Delphi应用程序中遇到问题,确定当前应用程序(当前线程)句柄.我知道我可以使用Windows API函数获取当前线程ID GetCurrentThreadID,但我需要当前的Thread句柄作为另一个Windows API函数SuspendThread的param.
实际上我想要做的是让我的旧dll之一用于挂钩kernel32.dll中的API函数,OpenProcess或者TerminateProcess也用于挂钩SuspendProcess.Hook位于dll文件中,使用SetWindowsHookEx注入正在运行的进程,然后查找目标函数的基址.挂钩函数如TerminateProcess我没有问题,因为它需要进程ID作为param,很容易在主应用程序中使用GetCurrentProcessID.要为SuspendThread函数创建类似的钩子,我需要将线程句柄作为参数传递.
只有我找到线程句柄的地方才是PROCESS_INFORMATION包含的结构
typedef struct _PROCESS_INFORMATION { // pi
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;
Run Code Online (Sandbox Code Playgroud)
但问题是这个结构只有在用CreateProcessAPI函数创建进程后才可用.主要目标是防止程序用户使用ProcessExplorer等在线提供的不同工具来终止进程.我实现了成功挂钩TerminateProcess API调用并阻止关闭我的应用程序,但这些过程探索工具中的挂起选项可以暂停我的进程.它是互联网信息亭应用程序,用户无法关闭该应用程序至关重要.应用程序当前在Windows XP中运行,并且必须在管理员帐户上运行,因为用户在登录我的应用程序后使用的其他应用程序需要管理员帐户才能运行,因此我不能简单地在受限用户下运行我的应用程序.
有什么办法可以在Delphi中获得我的主应用程序主线程句柄吗?
提前致谢
在for循环中有一个CreateThread()调用,我希望所有的线程一个接一个地启动,每个线程将数据写入一个对象.
`$while (ii != mapOServs.end())
{
Array_of_Thread_Handles[i] = CreateThread(NULL,0,MyThread, &args[i] , 0 , NULL);
}
Run Code Online (Sandbox Code Playgroud)
但是线程在遇到WaitForMultipleObjects或WaitForSingleObject之前不会启动.
如何让所有线程一个接一个地运行而不等待响应?
此外,最好的对象是什么,以便它可以同时由不同的线程修改.
我正在使用delphi 6处理应用程序,我试图将相机集成到现有应用程序中,相机代码将捕获的帧显示到Tpanel上,在我的应用程序中我需要在Tpaintbox上显示捕获的帧(我不是原始编码器)
这是来自的代码示例
procedure TFrameThreadX.DrawFrame;
var
hdc:THandle;
begin
//do processing
.
.
hdc := GetDC( ViewForm.ViewPanel.Handle );
SetStretchBltMode(hdc,COLORONCOLOR);
StretchDIBits(hdc,0,0,nW,nH,0,0,ScW,ScH,DibPixels,TBitMapInfo((@FDib)^),DIB_RGB_COLORS,SRCCOPY);
ReleaseDC( ViewForm.ViewPanel.Handle, hdc );
//do processing
end;
Run Code Online (Sandbox Code Playgroud)
这里是得到Tpanel手柄为87248682的这
hdc := GetDC( ViewForm.ViewPanel.Handle );
Run Code Online (Sandbox Code Playgroud)
所以当我尝试在这样的代码中使用Tpaintbox时
hdc := GetDC( ViewForm.PaintBox1.Canvas.Handle);
Run Code Online (Sandbox Code Playgroud)
结果是0,
所以相机框架不显示..
所以我试过这个
使用GetDC和GetWindowDC,但在这两种情况下,句柄的函数结果为0,

我的代码
var
hdc : THandle;
begin
hdc := GetDC(Panel1.Handle);
Label1.Caption:=inttostr(hdc);
hdc := GetDC(Image1.Canvas.Handle);
Label2.Caption:=inttostr(hdc);
hdc := GetDC(PaintBox1.Canvas.Handle);
Label3.Caption:=inttostr(hdc);
end;
Run Code Online (Sandbox Code Playgroud)
对于GetWindowDC
var
hdc : THandle;
begin
hdc …Run Code Online (Sandbox Code Playgroud) 我读了一些关于MainWindowHandle的线程,但我无法找到解决我的问题的方法,我正在启动一个gui应用程序,并希望通过进程对象获取MainWindowHandle,但如果我不打算将句柄值始终为零等待thread.sleep()直到加载gui.我也尝试使用WaitForInputIdle,但它根本没有帮助.
process.Start();
process.WaitForInputIdle(1000);
while (process.MainWindowHandle == IntPtr.Zero)
{
Thread.Sleep(100);
}
// do something with the handle
Run Code Online (Sandbox Code Playgroud)
他永远不会离开,如果我用正常的线程替换waitforinputidle.睡觉他得到正确的句柄.
简单地说:我只想继续我的代码,如果我得到一个句柄!=零,但我不想等待一个静态的时间
我遇到了处理线程完成的类的问题.它可以通知其他线程,因为第二个线程可以启动.这是我的项目结构:
MainClass.java
public class MainClass implements ThreadCompleteListener {
public void main(String[] args) throws InterruptedException {
NotifyingThread test = new Thread1();
test.addListener((ThreadCompleteListener) this);
test.start();
}
@Override
public void notifyOfThreadComplete(Thread thread) {
// TODO Auto-generated method stub
}
}
Run Code Online (Sandbox Code Playgroud)
类 - Thread1.java
public class Thread1 extends NotifyingThread {
@Override
public void doRun() {
try {
metoda();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static synchronized void metoda() throws InterruptedException {
for(int i = 0; i …Run Code Online (Sandbox Code Playgroud) 可以将Win32初始化HANDLE为NULL吗?还是有更好的或推荐的方法来初始化HANDLEs?
例如,
void foo()
{
HANDLE hFile;
hFile = CreateFile(/* necessary arguments*/);
}
Run Code Online (Sandbox Code Playgroud)
我应该hFile用什么来初始化?
我正在编写一个小的PHP脚本来将表单数据保存到文件中,一切正常,除了\n没有在文件中向下移动一行.它在同一行上打印所有数据.
<?php
$firstname = $_POST["firstname"];
$email = $_POST["email"];
$handle = fopen('details.txt','a');
fwrite($handle, $firstname ."\n");
fwrite($handle, $email);
?>
<br>
Your email address is: <?php
echo $_POST["email"];
?>
Run Code Online (Sandbox Code Playgroud) 我在一个网站(http://www.rajeshpatkar.com/articles/javarefpnt/)上读到,当我们实例化一个类时,即
Emp e = new Emp();
Run Code Online (Sandbox Code Playgroud)
句柄存储在变量e中,该变量不是指针,即它不将对象的地址存储在存储器中.
该解释给出了指针数组的示例.存储器地址存储在[1]位置,当移动对象时,该位置用新地址更新.
那么为什么使用这个数组而不是直接存储地址(它表明它有助于GC,但我不理解它)并在移动对象时更新它(存储在e中的地址)?
我花了很多时间来理解这一点,但仍然没有找到满足我的答案.因此,如果你能解释一下实际存储在变量'e'中的内容(带有一个例子),它将会安静有用.
谢谢 :)
我无法理解以下代码段.简单的调用看起来像这样,没有任何赋值或者:
expression1@expression2;
Run Code Online (Sandbox Code Playgroud)
expression2 指的是一个自定义的句柄类.
我查看了句柄,但无法弄清楚给定的调用结构的作用,从正常的例子@(x) x^2;或者在f = @sin;网上找不到类似的例子.
任何关于符号可能做什么的帮助都表示赞赏.