小编dbo*_*eam的帖子

x64 DLL导出函数名称

我试图将32位dll(和应用程序)移植到64位,我已经设法构建它没有错误.当我尝试使用我的64位应用程序加载它时,我注意到导出的函数名称不同.这是我导出函数的方式:

#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllexport) long __stdcall Connect(char * name, long size);

#ifdef __cplusplus 
}
#endif
Run Code Online (Sandbox Code Playgroud)

在Dependency Walker中,导出的函数具有以下格式:

32位: _Connect@8

64位: Connect

在使用dll的应用程序中,我显式加载了dll(LoadLibrary成功)但GetProcAddress因64位而失败,因为它找不到具有提供名称的函数.

在我们的应用程序中,我保留函数名称如下:

#define ConnectName "_Connect@8"
...
GetProcAddress(Dll, ConnectName);
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否可以为32位和64位dll导出相同的函数名称,或者这是一个坏主意?或者我需要在我的应用程序中执行以下操作:

#if _WIN64
#define ConnectName "Connect"
#else
#define ConnectName "_Connect@8"
#endif
Run Code Online (Sandbox Code Playgroud)

我感谢任何帮助.

c++ dll 64-bit name-mangling

8
推荐指数
1
解决办法
8342
查看次数

WPF TextBox MenuItem在移动鼠标时失去焦点

在我的WPF应用程序中,我想要一个菜单​​项有一个文本框.我已设法使用以下代码执行此操作:

<Menu Height="23" HorizontalAlignment="Stretch" Name="MainMenu" VerticalAlignment="Top">
    <MenuItem Header="File">
        <MenuItem Header="Exit" Click="menuItemExit_Click" />
    </MenuItem>
    <MenuItem Header="Settings">
        <MenuItem Header="Some setting" IsCheckable="True" />
        <Separator />
        <MenuItem>
            <MenuItem.Header>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Label Content="Some value:" Margin="0,3,6,0" Padding="0" />
                    <TextBox Margin="0,0,0,6" Grid.Column="1" />
                </Grid>
            </MenuItem.Header>
        </MenuItem>
    </MenuItem>
</Menu>
Run Code Online (Sandbox Code Playgroud)

此代码显示像我预期的菜单项,但如果我开始在文本框中键入一些值,然后移动鼠标(而不是单击)远离文本框菜单项,文本框失去焦点,我无法继续键入,直到我点击再次在文本框上.如何在WinForms中实现与文本框菜单项相同的行为?也就是说,如果用户在文本框外部单击或按Tab键,则文本框仅失去焦点.

提前致谢.

wpf textbox lost-focus menuitem

7
推荐指数
1
解决办法
3877
查看次数

WPF FindAncestor绑定

关于FindAncestor的一个特别之处让我感到困惑,请看下面的例子:

<Expander.HeaderTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <Label Name="headerLabel"  Content="Show Contents" Padding="0" VerticalAlignment="Center" />
            <Button Name="headerButton" Margin="6,0,0,0" Content="Button" Padding="6,1" />
        </StackPanel>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}, Path=IsExpanded}" Value="True">
                <Setter TargetName="headerLabel" Property="Content" Value="Hide Contents" />
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</Expander.HeaderTemplate>
Run Code Online (Sandbox Code Playgroud)

我使用上面的xaml来更改我的自定义扩展器标头的文本.我的问题是,当我想在绑定中使用祖先的属性时,我何时才需要显式使用FindAncestor?因为以下三个绑定似乎至少在我的场景中产生相同的结果:

Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}, Path=IsExpanded}"

Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}, Path=IsExpanded}" 

Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Expander}}, Path=IsExpanded}"
Run Code Online (Sandbox Code Playgroud)

我看过很多这三个例子,这只是个人品味的问题吗?

wpf binding

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

WPF 中的鼠标额外按钮

是否可以捕获 WPF 中鼠标额外按钮的点击?我想在我的应用程序中使用鼠标实现后退和前进导航,就像浏览互联网一样。当单击额外的按钮时,我想执行命令。我只找到了使用左/右/滚轮按钮的示例。

提前致谢。

wpf mouseevent

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

使用 TabControl 和 MVVM 时绑定丢失

我仍然认为自己是 MVVM 的初学者,并且我在 TabControl 中遇到了绑定问题。我的应用程序允许用户创建国家和州,输入一些信息,然后将它们保存到数据库中。下面是我的应用程序结构的描述:

基础 ViewModel/View 称为 ApplicationViewModel/ApplicationView。ApplicationViewModel 有一个名为 Tabs 的 ObservableCollection,由一个 AllNationsViewModel 和一个 AllStatesViewModel 组成。此 Tabs 属性绑定到 ApplicationView 中的 TabControl 的 ItemsSource。

AllNationsViewModel/AllNationsView 用于显示用户输入的所有国家。它还允许用户创建新的国家并选择一个特定的国家进行仔细检查。AllStatesViewModel/AllStatesView 做同样的事情,但对于状态。

最后,我有处理特定国家的 NationViewModel/NationsView;这里还有 StateViewModel/StateView 对状态做同样的事情。

对于一个国家,您目前只能输入一个名称,但对于一个州,您可以输入一个名称以及它所属的国家。使用组合框选择国家,其中显示在国家选项卡中创建的所有国家。

我使用名为 DataFacade 的静态类作为数据存储的接口。可以使用此界面添加、删除和检索国家/地区列表;它还会在添加或删除某些内容时触发事件。

我遇到的问题是,当在 AllStatesViewModel(CurrentStateViewModel 属性)中选择了一个州时,我转到国家选项卡,然后返回到状态选项卡,当前选定的州已经失去了它的国家。所有其他州仍然很艰难。

我将尝试在下面显示相关代码(我已从某些方法中删除了不相关的代码):

状态类:

class State
{
   public string Name { get; set; }

   public Nation Nation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

ApplicationView 中的 TabControl:

<TabControl ItemsSource="{Binding Tabs}" Margin="6">
   <TabControl.ItemTemplate>
      <DataTemplate>
         <ContentPresenter Content="{Binding DisplayName}" />
      </DataTemplate>
   </TabControl.ItemTemplate>
   <TabControl.ContentTemplate>
      <DataTemplate>
         <ContentPresenter Content="{Binding }" />
      </DataTemplate> …
Run Code Online (Sandbox Code Playgroud)

c# wpf mvvm

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

WPF 甜甜圈进度条

我正在尝试将《WPF 4 Unleashed》一书中找到的饼图 ProgressBar 调整为看起来像甜甜圈。我觉得我已经成功了一半,但我不知道如何解决最后一个问题。

这是一张图片,说明了我想要的以及我已经实现的目标:

在此输入图像描述

  1. 这就是我想要的样子。
  2. 使用下面的代码就是这样的。
  3. 我在 stackoverflow 的另一个问题中发现了一个建议,即在路径上使用剪切并将笔画厚度加倍。正如您所看到的,路径现在已正确定位,但任何低于 50% 的进度都不会正确绘制,如您所见。

所以我的问题是,如何将其修复为我想要的样子?

以下是我正在使用的相关xaml:

<ControlTemplate x:Key="DonutProgressBar" TargetType="{x:Type ProgressBar}">
    <ControlTemplate.Resources>
        <conv:ValueMinMaxToIsLargeArcConverter x:Key="ValueMinMaxToIsLargeArcConverter" />
        <conv:ValueMinMaxToPointConverter x:Key="ValueMinMaxToPointConverter" />
    </ControlTemplate.Resources>
    <Grid>
        <Viewbox>
            <Grid Width="20" Height="20">
                <Ellipse x:Name="Background"
                         Stroke="{TemplateBinding BorderBrush}"
                         StrokeThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness.Top}"
                         Width="20"
                         Height="20"
                         Fill="{TemplateBinding Background}" />
                <Path x:Name="Donut" 
                      Stroke="{TemplateBinding Foreground}"
                      StrokeThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness.Top}">
                    <Path.Data>
                        <PathGeometry>
                            <PathGeometry.Figures>
                                <PathFigure StartPoint="10,0">
                                    <ArcSegment Size="10,10" SweepDirection="Clockwise">
                                        <ArcSegment.Point>
                                            <MultiBinding Converter="{StaticResource ValueMinMaxToPointConverter}">
                                                <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Value" />
                                                <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Minimum" />
                                                <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Maximum" /> …
Run Code Online (Sandbox Code Playgroud)

c# wpf

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

从 32 位进程检索 x64 程序文件路径

首先介绍一下背景。我为我的 WiX 安装程序创建了一个 WPF 引导程序应用程序,我需要在其中检索和显示默认安装位置。除非我做错了什么,即使我的 Visual Studio 配置设置为 x64,WiX 创建的可执行文件似乎始终是 32 位的,这会导致我的问题。

由于可执行文件始终为 32 位,因此即使我想安装 x64 MSI 文件,包含我的 WPF 引导程序应用程序的库也会加载为 32 位。所以,当我尝试使用它检索默认的安装路径Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),我得到C:\ Program Files文件(x86)的,而不是C:\ Program Files文件。在 64 位操作系统上运行时,如何从 32 位进程中检索C:\Program Files

我发现了类似的问题,但我没有找到足够的答案,我想要一个即使操作系统语言不是英语也能工作的解决方案。我正在考虑从检索到的路径中删除“(x86)”,但它看起来很笨拙,我不确定它是否适用于所有情况。

c# 64-bit wix

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

标签 统计

wpf ×5

c# ×3

64-bit ×2

binding ×1

c++ ×1

dll ×1

lost-focus ×1

menuitem ×1

mouseevent ×1

mvvm ×1

name-mangling ×1

textbox ×1

wix ×1