假设我有一个名为A的类:
Class A
{
...
}
Run Code Online (Sandbox Code Playgroud)
以下两种实现对象的方法之间的区别是什么:
void main(void)
{
A a; // 1
A *pa=new A(); // 2
}
Run Code Online (Sandbox Code Playgroud)
正如我目前的理解(尚未确定):
方法1在main()方法的堆栈帧上分配对象a,因此该对象无法删除,因为该删除没有意义(不知道为什么,有人可以解释一下吗?).
方法2在进程的堆上分配对象a,并在main()方法的堆栈帧上分配A*vairable pa,因此可以删除对象,并且可以在删除后将pa指定为null.
我对吗?如果我的理解是正确的,有人可以告诉我为什么我不能在方法1中从堆栈中删除一个对象?
非常感谢...
我对COM很新,所以这个问题可能看起来很幼稚.
Q1.关于Windows DLL
根据我的理解,Windows DLL可以导出函数,类型(类)和全局变量.这种理解是否正确?
Q2.关于COM
我天真的理解是:COM DLL似乎只是一种新的逻辑方式来组织标准Windows DLL导出的函数和类型.COM DLL导出两个函数,如DllRegisterServer()和DllGetClassObject(),以及实现IUnknown接口的类.这种理解是否正确?
Q3.*.def&*.idl
*.def用于定义Windows DLL以传统方式导出的函数,例如DllGetClassObject().*.idl用于定义COM coclass实现的接口.
提前致谢.
我通过C#System.Diagnostics.Process类型执行ftp.exe cmd.在我以编程方式输入"help"命令后,我使用以下代码获取"ftp.exe"输出.但我只能得到结果的第一行.而且我从未进入"结束"输出部分.整个计划似乎被封锁了.
Process p = new Process();
p.StartInfo.FileName = @"C:\Windows\System32\ftp.exe";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.UseShellExecute = false;
p.Start();
p.StandardInput.WriteLine("help");
Int32 c_int = p.StandardOutput.Read();
while (c_int != -1)
{
Char c = (Char)c_int;
Console.Write(c);
c_int = p.StandardOutput.Read();
}
Console.WriteLine("end");
Run Code Online (Sandbox Code Playgroud)
但是,我编写了一个简单的程序,它只使用Console.Writeline()将一些输出写入其StdOut流.我用上面的代码测试它.它工作正常.我只是想不通为什么上面的代码无法使用ftp.exe?我的SimpleConsoleOutput程序和"ftp.exe"之间的唯一区别是ftp.exe有自己的交互式命令提示符.
(---------------新进展-----------------)
以下是我个人调查的一些进展.
我写两个线程写入StdIn并从StdOut读取"ftp.exe",输出如下:
Commands may be abbreviated. Commands are:
Commands may be abbreviated. Commands are:
Commands may be abbreviated. Commands are:
....(exactly 16 times of above lines and then exactly 16 times of …
Run Code Online (Sandbox Code Playgroud) 我正在为我的主项目在C#中编写一个自定义Control类.
有2个项目,一个用于我的Control,一个用于我的主项目.这两个项目在同一个解决方案中.我将主项目的引用添加到Control项目中.我注意到,第一次将Control从工具面板拖到我的主winform上后,在C:\ Users\XXX\AppData\Local\Microsoft\VisualStudio\9.0\ProjectAssemblies中生成了一个程序集文件夹,以及文件夹名称就像" jlebh-py01 ".
第一个构建总是正常,但在重建我的Control类或整个解决方案后,将在C:\ Users\XXX\AppData\Local\Microsoft\VisualStudio\9.0\ProjectAssemblies生成一个新的程序集文件夹,然后出现问题,我的控件无法表现良好,因为Visual Studio说这两种类型"来自不同的位置".错误消息如下:
[A] MyControl.TypeXXX无法转换为[B] MyControl.TypeXXX.从assemblyXXX在位置'C:\ Users\XXX\AppData\Local\Microsoft\VisualStudio\9.0\ProjectAssemblies\jlebh-py01\MyControl.dll'中键入A orginates来自assemblyXXX的位置'C:\ Users\XXX \应用程序数据\本地\微软\ VisualStudio的\ 9.0\ProjectAssemblies\ue4i-z3j01\MyControl.dll"
如果我直接引用Control DLL而不是通过项目引用,或者在主项目中使用我的Control之后从不重建Control项目,那么事情似乎没问题.
有谁知道为什么? 这是在同一解决方案中开发控件和主项目的正确方法吗?
我想知道.NET构造的内存表示,例如" interface "," class "," struct "等.有一本很好的C++对象模型书 - Stanley的<C++对象模型内部 >.Lippman,我想要一本类似于.NET和C#的书.
我已经阅读了一些关于.NET的书籍,但它们主要是关于.NET 的逻辑用法.他们都没有谈到物理内存布局信息.我认为有必要至少知道.NET的一个实现.
我已经读过" 钻入.NET Framework内部以了解CLR如何创建运行时对象 "有人可以提供一些关于更深入的书籍和文章的提示吗?
如果此信息不公开.可以选择Mono或Shared Source CLI等共享源.
非常感谢.
我正在尝试使用mc.exe为我的事件日志编写程序创建消息文件.但即使是Microsoft提供的示例消息文件也无法编译.谁知道如何编写可以由mc.exe编译的消息文件?
编辑:我得到的错误信息是:
msgs.mc(1) : error : expected keyword
- ??
Run Code Online (Sandbox Code Playgroud)
编辑2:问题解决了.mc.exe只能支持Unicode或ANSI编码的源文件.我的文件编码为UTF8.而已.
谢谢.
在我的场景中,我想在单独的AppDomain中执行一个方法.我可以采取多少种不同的方法来实现这一目标?
特别是,我有以下问题:
我读了以下声明:
SQL Server不会立即将数据写入磁盘.它保存在缓冲区缓存中,直到此缓存已满或直到SQL Server发出检查点,然后写出数据.如果在缓存仍在填满时发生电源故障,则该数据将丢失.但是,一旦电源恢复,SQL Server将从其上一个检查点状态开始,并且将在事务日志中执行作为成功事务记录的最后一个检查点之后的任何更新.
并出现了几个问题:
如果在 SQL Server发出检查点之后和缓冲区高速缓存被执行写入磁盘之前发生电源故障怎么办?缓冲区缓存中的内容是否永久丢失?
事务日志也存储为磁盘文件,与实际数据库文件没有区别.那么我们怎样才能保证日志文件的完整性呢?
那么,真的没有真正的交易存在吗?这只是概率问题.
我安装了SSRS 2012并尝试访问 http://mybox.org/Reports,但收到错误消息:
用户'mybox\xxx'没有所需的权限.验证是否已授予足够的权限并已解决Windows用户帐户控制(UAC)限制
所以我试着检查IIS设置.但令人惊讶的是,在我的IIS 8管理控制台中,没有Reports网站或虚拟文件夹.那么,报告在哪里托管?以及如何解决此权限错误?
是否可以使用external build system
for VC++ 2013?我希望Visual Studio不做任何事情,只需通过调用我的构建工具来构建.
我在考虑这样的事情:
通过右键单击解决方案并选择构建来调用解决方案级别的构建批处理.
有一些演练教程吗?我搜索了很多但没有运气.
在简要介绍了这个MSBuild
过程后,我尝试了如下.
首先,我编辑*.vcxproj
项目文件.我改变DefaultTargets
从Build
到MyTarget
.
<Project DefaultTargets="MyTarget" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Run Code Online (Sandbox Code Playgroud)
然后我添加一个名为的新目标MyTarget
:
<Target Name="MyTarget">
<Message Text="Hello, Bitch!" />
</Target>
Run Code Online (Sandbox Code Playgroud)
我希望这可以绕过VS2013内置的构建过程,只执行我自己的批处理.
它在命令提示符下运行良好:
但是在Visual Studio中,当我右键单击项目并选择build
命令时,它会给我带来很多链接错误.
如何避免这些链接错误?由于我的批处理可以处理所有构建过程,因此我不需要Visual Studio为我做链接.
似乎这些链接错误显示出来,因为我包含*.c
带有ClCompile
标记的文件如下所示.
<ItemGroup>
<ClCompile Include="z:\MyProject1\source1.c" />
<ItemGroup>
Run Code Online (Sandbox Code Playgroud)
由于我不希望VS2013调用编译器,我将其更改为<ClInclude>
标记,链接错误消失,但符号解析不起作用......似乎我不应该更改标记.
这是另一种无需链接编译的方法.
Visual Studio C++是否可以在没有链接的情况下编译对象
似乎它没有符号解析问题.但我仍然无法通过点击调用外部批次build/rebuild/clean
.
c# ×5
c++ ×3
.net ×2
com ×1
command-line ×1
custom-build ×1
database ×1
dll ×1
event-log ×1
sql-server ×1
ssrs-2012 ×1
visual-c++ ×1