小编Ult*_*nks的帖子

波形符在表达式中意味着什么?

可能重复:
C#枚举中的波浪号(〜)是多少?

我在这个 MSDN页面上找到了以下代码.

(((Width * Planes * BitCount + 31) & ~31) / 8) * abs(Height)
Run Code Online (Sandbox Code Playgroud)

这确实可以在C#visual studio 2010中编译.在数字31前面,代字号"〜"究竟是什么?我以前从未在表达式中看到过这种语法.

c# syntax

29
推荐指数
4
解决办法
3万
查看次数

如何在运行时将wpf控件添加到特定网格行和单元格?

我的WPF"窗口"中有以下网格(是类窗口);

<Grid Name="RequiredGrid">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="70" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
        </Grid>
Run Code Online (Sandbox Code Playgroud)

根据传递到窗口的内容,我想一次一行地将项添加到此网格中.也就是说,我想在左列中添加一个Label,在右列中添加一个TextBox.我相信我知道如何通过在后面的代码中执行以下操作来添加新行来保存新数据:

RequiredGrid.RowDefinitions.Add(new RowDefinition());
Run Code Online (Sandbox Code Playgroud)

问题是,在我创建了Label和TextBox之后.

Label AttrLabel = new Label();
TextBox AttrTextBox = new TextBox();
Run Code Online (Sandbox Code Playgroud)

我真的不知道怎么把它放到窗口中以便显示出来.我见过一些帖子说,做这样的事情:

this.Controls.Add(AttrLabel);
this.Controls.Add(AttrTextBox);
Run Code Online (Sandbox Code Playgroud)

这有两个问题.1)我的Window类没有这个"Controls"属性或其他什么.2)这无助于我指定每个UI项的行和列.

现在在XAML中,我很容易用这样的东西指定行和列:

 <Label Grid.Column="0" Grid.Row="0"/>
Run Code Online (Sandbox Code Playgroud)

这虽然击败了我的意图的"动态性".有谁知道如何让我的动态创建的UI元素显示在我的窗口中,并指定它将在网格中显示的行和列.

wpf grid user-interface dynamic

21
推荐指数
2
解决办法
3万
查看次数

为什么某些对象无法从不同的线程访问?

在使用C#进行开发时,我多次遇到过这个问题.我将是一个愉快的编码,在线程之间来回传递对象,什么不是,然后我突然得到这个熟悉的错误:

"调用线程无法访问此对象,因为另一个线程拥有它."

好吧,好吧,我之前已经处理过,尤其是GUI线程上的对象.您只需编写一些额外的代码来围绕该特定问题进行编程.但是每当我遇到一个普通的对象时,它就不喜欢被不同的线程访问了.

编辑我在原始帖子中误解了导致访问异常的对象.它不是IPAddress,而是System.Printing.PrintQueue.我用它来获取IP地址.这是您无法从多个线程评估的对象.

我写的所有课程都没有这个问题.我甚至不知道自己如何实现这一点.您是否必须使用创建您的线程ID保留成员变量,然后在每个属性和方法访问权限上检查当前线程?这看起来很疯狂.为什么微软会决定......"好吧...... PrintQueue,绝对不能在线程中共享.但是这些其他的类......他们的好处."

为什么某些对象被阻止多线程访问?

c# multithreading

14
推荐指数
1
解决办法
774
查看次数

Visual Studio 2010"安装项目"注册表编辑器不起作用

我有一个安装项目需要向注册表添加1个简单的字符串,并且安装项目中的内置注册表编辑器似乎根本不起作用.它默认将基本密钥HKEY_LOCAL_MACHINE\Software\[Manufacturer]放入安装项目中,甚至不起作用.

以下是我用来添加密钥的步骤.

  • 右键单击安装项目:查看 - >注册表
  • 将显示模拟注册表,并根据需要深入创建密钥.
  • 我创建HKEY_LOCAL_MACHINE\Software\[制造商]\[ProductName]
  • 运行安装程序.没有报告错误,但密钥不存在.

编辑:看看这个网页上的图5 .它向你展示了我看到的东西,除了看起来像是一个更老版本的visual studio.

我不知道这怎么会失败,应该这么简单.我甚至尝试过简单的键,它不会创建任何东西,或者至少会抛出错误.我已经看过这个解决方案,但是当有内置功能时,添加一个post build步骤来手动编辑注册表是荒谬的.该帖子表明该功能刚好被破坏,所以不要使用它.

registry installation installer install setup-project

13
推荐指数
1
解决办法
8742
查看次数

无法使用x509证书签署JWT令牌

我在使用我创建的证书签署JWT令牌时遇到问题.我理解签名(公钥/私钥)如何工作的基本原理,但是类和工具集非常混乱.我一直在忙着这个示例代码,我已经完全陷入了困境.当我运行附加的示例代码时,我最终得到以下错误(在tokenHandler.CreateToken()通话中):

System.NotSupportedException:'IDX10634:无法创建SignatureProvider.算法:'[PII is hidden]',SecurityKey:'[PII is hidden]'不受支持.

我提供了我在CertificatePfxFileBase64Encoded变量base64编码中创建的证书.它是一个.pfx文件,其中嵌入了私钥,没有密码.它是一个二进制文件,所以我必须base64编码才能在这里分享它.我正在努力弄清楚这些课程是如何运作的,但我无法克服这个障碍.有任何想法吗?下面的示例应该是完全自包含的,您只需要收集引用.

using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Security.Cryptography.X509Certificates;

namespace SecurityStuff
{
    public class Testing
    {
        static string CertificatePfxFileBase64Encoded = @"
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
B1gJ8j4mJ7HmXhEABAjfmw/u2zlmsAICCAA=";

        public …
Run Code Online (Sandbox Code Playgroud)

c# x509certificate2 x509certificate x509 jwt

11
推荐指数
1
解决办法
2694
查看次数

NamedPipeServerStream.EndWaitForConnection()在使用时会挂起

我第一次尝试使用命名管道.在此处找到的MS文档中,它指出:

对于每次调用BeginWaitForConnection,必须只调用一次EndWaitForConnection.

所以我想成为一个优秀的小程序员并遵循文档,但是EndWaitForConnection()当我使用它时,它会无限期地挂起.

所以我把我的代码剥离到最低限度,所以看看我是否可以隔离问题而不是骰子.我已经从我写过的课程中提取了以下代码.我已修改它,以便它开始在管道连接上等待,然后立即尝试停止等待该管道连接:

private void WaitForConnectionCallBack(IAsyncResult result)
{

}

public void Start()
{
    var tempPipe = new NamedPipeServerStream("TempPipe",
                                             PipeDirection.In,
                                             254, 
                                             PipeTransmissionMode.Message,
                                             PipeOptions.Asynchronous);

    IAsyncResult result = tempPipe.BeginWaitForConnection(
                                    new AsyncCallback(WaitForConnectionCallBack), this);

    tempPipe.EndWaitForConnection(result);  // <----- Hangs on this line right here
}
Run Code Online (Sandbox Code Playgroud)

1)为什么要坚持下去EndWaitForConnection()?如果我想在收到连接之前关闭我的服务器,我怎么能基本上取消这个BeginWaitForConnection()回调?

2)我们假设我没有上述问题.如果2个客户端尝试很快连接到我的命名管道会发生什么?

我是否为每个人获得了回调调用,或者我是否必须等待接收第一个连接通知EndWaitForConnection()然后 WaitForConnectionCallBack()再次快速呼叫再次开始侦听下一个客户端?

后者对我来说似乎是一种竞争条件,因为我可能不会足够快地设置连接侦听器.

c# asynchronous named-pipes interprocess

10
推荐指数
1
解决办法
6285
查看次数

无法通过"DllMain已定义"错误获取

我正在尝试为.dll注入写一个.dll库.而且由于这个事实,它必须有一个名为DllMain的例程,因为这将被用作入口点.我认为我的问题可能源于这样一个事实,即我在一个静态库中进行链接,该库使用了afxmt.h中的线程和互斥锁.因为在某个地方,包含这个导致链接器从mfcs100ud.lib链接,mfcs100ud.lib显然包含自己的DllMain版本.

这是给我带来麻烦的文件:

dllmain.cpp

#include "stdafx.h"
#include <stdio.h>
#include "NamedPipeLogger.h"

static CNamedPipeLogger m_PipeLogger("Log.txt");

BOOL APIENTRY DllMain(HANDLE hModule, 
                      DWORD  ul_reason_for_call, 
                      LPVOID lpReserved)
{
}
Run Code Online (Sandbox Code Playgroud)

这是dllmain.cpp包含的stdafx.h文件.

stdafx.h中

#pragma once

#define _AFXDLL
#include <Afx.h>

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
Run Code Online (Sandbox Code Playgroud)

这是我的错误消息:

错误32错误LNK2005:_DllMain @ 12已在dllmain.obj中定义D:\ xxxxx\xxxxx\xxxxxx\mfcs100ud.lib(dllmodul.obj)

我只是搞砸了,因为我不能将我的Dll入口点的名称更改为DllMain以外的其他名称?

c++ dll compiler-errors compilation linker-errors

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

如何使用非托管 EasyHook 从进程内的任何线程挂钩方法?

我在让我的方法挂钩工作时遇到了一些问题。如果“我”调用被挂钩的方法,我就可以让挂钩工作。但是当它在进程操作期间自然发生时,它就不会被吸引。我的问题可能源于这样一个事实:我实际上是在我自己生成的线程中设置这些钩子。显然 LhSetInclusiveACL() 方法需要知道您想要挂钩的线程。嗯,这是我的问题......

\n\n

我并不关心哪些线程应用了钩子,我希望它们都被钩子。例如,假设我希望“gdi32.dll”库中的 CreateICW() 方法与整个进程“iexplorer.exe”挂钩。不仅仅是来自线程 ID 号 48291 或其他什么。要知道哪些线程将调用您有兴趣挂钩的例程,需要深入了解您正在挂钩的进程的内部工作原理。我推测这通常是不可行的,而且对我来说当然也不可行。因此,我不可能先验地知道哪些线程 ID 需要被挂钩。

\n\n

以下代码取自“UnmanageHook”示例:

\n\n
extern "C" int main(int argc, wchar_t* argv[])\n{\n    //...\n    //...\n    //...\n\n    /*\n        The following shows how to install and remove local hooks...\n    */\n    FORCE(LhInstallHook(\n            GetProcAddress(hUser32, "MessageBeep"),\n            MessageBeepHook,\n            (PVOID)0x12345678,\n            hHook));\n\n    // won\'t invoke the hook handler because hooks are inactive after installation\n    MessageBeep(123);\n\n    // activate the hook for the current thread\n    // This is where I believe my problem is.  ACLEntries is \n    // supposed to …
Run Code Online (Sandbox Code Playgroud)

c++ hook unmanaged easyhook

6
推荐指数
1
解决办法
2723
查看次数

在Windows C++或C#中,您可以询问操作系统当前是否正在关闭/重新启动/注销

我有一个在关机期间发生的问题.我有一段用C++编写的代码,它包含在.dll中并注入到其他应用程序中.它做了很多事情,包括启动用C#编写的另一个应用程序(服务器).

但是,在启动关闭后,c ++代码启动C#应用程序,因为它已被关闭杀死,因为系统即将关闭而立即崩溃.

然后一个错误框停止关闭,直到用户处理它,这很烦人.有没有办法问操作系统,"嘿,你关闭/重启/退出了吗?" 所以当发生这种情况时,我不会启动应用程序?我想两端的解决方案都没问题.

== 编辑 ==

再澄清一点.作为注入的.dll运行的代码不能假设它注入的应用程序具有任何类型的"窗口".此外,我想要一些我可以查询的东西,而不是我必须听的事件,因为我可能因为时间错过了那个事件.我想知道是否有任何类型的功能可以有效地给我这样的东西

bool IsSystemShutting();
Run Code Online (Sandbox Code Playgroud)

在这方面,C#选项对我和C++选项都有用.但是在.NET框架中,SystemEvents.SessionEndingSystemEvents.SessionEnded都是事件与属性.我经常会在事件发生后报名参加此次活动,所以这对我来说没有好处.

c# c++ shutdown restart logout

6
推荐指数
1
解决办法
347
查看次数

如何在64位进程中拦截API方法调用?

背景

我正在研究一种遗留产品,它可以通过注入dll成功拦截一个任意方法调用,这个方法调用是一个注入过程试图进入一个任意的dll.特别是gdi32.dll库.不幸的是,它嵌入64位应用程序时不起作用.它成为一个热门按钮主题,现在是升级其功能的时候了.同样不幸的是,源代码是一堆条评论(典型的>: - <),从它的外观来看,写这篇文章的人对x86指令集非常熟悉.多年来我一直没有参与组装,当我这样做的时候是摩托罗拉组装.

在浏览互联网后,我从一位英特尔员工那里看到了这篇文章.如果我们的源代码没有在本文前约7年,那么我会说这正是我们的NoComments先生开发人员学会了执行API方法拦截的地方.这就是程序的相似之处.本文还总结了一个很好的pdf(拦截系统API调用),也可以从上述网站链接.

问题

我想真正理解英特尔网页链接中提供的示例,以便我可以很好地为64位方案创建解决方案.它有很好的文档记录,对我来说更容易理解.以下是InterceptAPI()例程的摘录.我添加了自己的评论"//#"(原始评论由标准"//" 标注),在那里我解释我认为我知道的和我不知道的:

BOOL InterceptAPI(HMODULE hLocalModule, const char* c_szDllName,
    const char* c_szApiName, DWORD dwReplaced, DWORD dwTrampoline, int offset) 
{ 
    //# Just a foreword.  One of the bigger mysteries of this routine to me is
    //# this magical number 5 and the offset variable.  Now I'm assuming, that
    //# there are 5 bytes at the beginning of every method that are basically 
    //# there to set up some …
Run Code Online (Sandbox Code Playgroud)

c++ x86 hook x86-64 dll-injection

5
推荐指数
1
解决办法
2470
查看次数