勾选时,我的复选框列没有响应,显然它被设置为只读,因此将状态再次更改为false将使得可以勾选.但是,这会将整个编辑模式变为true.我尝试将编辑模式设置为编程,同时将ReadOnly模式设置为false,但这将再次禁用该复选框.
如何在复选框列以外的所有单元格上禁用编辑模式?
背景信息: Windows 7,Visual C++ 2010 Express
问题: CreateProcess()通过'无效的命令行参数'继续返回
说明:我正在编写一段使用Windows API的CreateProcess调用外部程序的代码.到目前为止,我已接到使用一个外部程序的电话:
if( !CreateProcess( "C:\\Temp\\convert.exe",
t_str, // Arguments
...
}
//where t_str is " C:\\img1.jpeg C:\\img1.pgm" (ImageMagick if you're wondering).
Run Code Online (Sandbox Code Playgroud)
即使我将所有数据都推送到Windows字符串和指针中,我也可以完美地工作.所以我复制了CreateProcess()的所有修改,以便对另一个外部程序进行另一次调用:
if( !CreateProcess( "C:\\Temp\\sift.exe",
t_str2, // Arguments
...
}
//where t_str2 is ` < C:\\img1.pgm > C:\\img1.key`
Run Code Online (Sandbox Code Playgroud)
基本上,一些非常相似,但所有变量名称都已更改(因为我有两个调用运行串行).这就是问题所在; 这不会运行,而是打印出"无效的命令行参数:<C:\ img1.pgm".当然,这个命令在命令提示符下工作正常,但在我的代码中没有.
我将t_str2切换到其他一些不太复杂的东西(因为我知道sift.exe如何工作),我得到了相同的结果.当我只进行筛选而不是转换时,会发生同样的事情.
问题:可能导致此问题的原因是什么?我该怎么做才能进一步调试这个问题?关于我正在使用的方法的替代方案的任何建议?任何帮助表示赞赏.我可以提供进一步的代码,但它非常直接,并没有太多可能出错.
我需要编写C++ API,它包含几个使用.lib文件(MSVC)从Dll公开的导出C++类.从我理解的另一个问题的答案来看,导出的类方法不能使用异常,如果C++ API是在一个VC++版本中构建的(比如2010),而客户端代码是用另一个VC++版本编写的.由于异常不能成为公共API接口的一部分,我正在寻找另一种错误处理策略.我的限制:我不想使用COM,而丰富的错误代码系统(如HRESULT)对我来说还不够.我希望有类似异常的类,其中包含错误代码,错误消息和我需要的任何其他信息.另外,我不想为每个VC++版本单独构建.
我目前的做法如下.每个公共类方法都返回枚举值(如ErrorCode).在方法失败的情况下,像GetLastErrorInfo这样的静态函数返回指向C++类的指针(比如说ErrorInfo),它包含到达错误信息.ErrorInfo保留为特定于线程的数据,并包含当前线程中最后一次调用的错误信息.如果最后一次API调用成功,则GetErrorInfo返回NULL.
请考虑以下代码:
try
{
classPtr->DoSomething();
cout << classPtr->GetData() << endl;
}
catch(const MyException& ex)
{
cout << ex.GetErrorMessage() << endl;
return;
}
没有例外,它看起来像这样:
ErrorCode result;
int data;
result = classPtr->DoSomething();
if ( result != Success )
{
cout << MyClass::GetLastErrorInfo()->GetErrorMessage() << endl;
return;
}
result = classPtr->GetData(data);
if ( result != Success )
{
cout << MyClass::GetLastErrorInfo()->GetErrorMessage() << endl;
return;
}
cout << data << endl;
这看起来不太好.类接口很乱:每个函数现在都有ErrorCode返回类型.返回值成为输出参数.是否有更好的方法,允许达到错误信息,并保持干净的公共API接口?
我正在使用FileSystemWatcher检测.docx文件.打开时会检测文件,但文件名始终"已损坏".
3个例子:
如果我的文件名是:2711111.docx,则收到的文件名FileSystemWatcher.Changed是:〜$ 711111.docx.
对于文件:*2711111_1.docx*我得到文件名:*〜$ 11111_1.docx*我无法猜出我的文件名是什么,所以我正在寻找一般的解决方案.
对于包含/以字母开头的文件,它不会发生.
这是我的代码
MyPath = String.Format(@"C:\Users\{0}\NRPortbl\ACTIVE\{1}\"",
Public.UserName, Public.UserName);
FileSystemWatcher watcher = new FileSystemWatcher();
if (!System.IO.Directory.Exists(MyPath))
{
Public.Logger.Error(
String.Format
("Path of folders {0} not found", MyPath));
System.Windows.Forms.MessageBox.Show(
String.Format(
"There was a problem loading {0} " +
"NRPortbl libraray, contact administrator", Public.UserName));
return;
}
watcher.Path = MyPath;
watcher.Filter = "*.Docx";
watcher.IncludeSubdirectories = false;
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnDeleted);
watcher.EnableRaisingEvents = true; ...
public void …Run Code Online (Sandbox Code Playgroud) 所以回到基础,我试图把我的头围绕着vtable和诸如此类的东西.在下面的例子中,如果我要传递一个B*函数,那么该函数如何知道调用C对象的vtable 中的方法而不是vtable 中的方法A?是否有两个单独的VTable传递给该对象?接口指针真的只是vtables(因为接口,IIRC,不能包含属性声明)?
我想说的是,直到我真正尝试这个代码,我假设你不能一次继承多个接口/类(并且所有接口必须是线性的,可以这么说)以便vtable建立在自己身上.
如果我对vtable如何工作的想法是正确的(我现在知道它不是),那么传递一个B*和被调用的B::OutB()将会调用A:OutA()(显然不是这种情况).
有人可以解释一下吗?
// Includes
#include <windows.h>
#include <iostream>
interface A
{
public:
virtual void OutA() = 0;
};
interface B
{
public:
virtual void OutB() = 0;
};
class C : public A, public B
{
public:
void OutA();
void OutB();
};
void C::OutA()
{
printf("Out A\n");
}
void C::OutB()
{
printf("Out B\n");
}
int main()
{
C obj;
obj.OutA();
obj.OutB();
A* …Run Code Online (Sandbox Code Playgroud) 我已经尝试了很多其他的东西,但是因为我已经尝试解决这个问题已经有2天了,所以我基本上已经尝试了互联网上的所有可能的解决方案.请帮忙.
我试图将c#代码转换为c ++/cli.一切顺利,直到我开始将接口事件显式实现转换为c ++/cli语法.
让我们说在c#我有这个界面
public interface Interface
{
public event MyEventHandler Event;
}
Run Code Online (Sandbox Code Playgroud)
这是以明确的方式在Class中实现的,因此它不会通过其名称与另一个成员冲突:
public interface Class : Interface
{
event MyEventHandler Interface.Event;
public event AnotherEventHandler Event;
}
Run Code Online (Sandbox Code Playgroud)
我试图将Class转换为c ++/cli,如下所示:
public ref class Class : public Interface
{
virtual event MyEventHandler^ Event2 = Interface::Event
{
}
...
};
Run Code Online (Sandbox Code Playgroud)
这将无法编译,在"... = Interface :: Event"部分给出了语法错误.有没有人知道什么是正确的语法,或者它甚至存在于c ++/cli中?我花了一些时间在互联网上搜索,但未能碰到任何有用的东西.
更新:这是完整的c ++/cli代码,用于演示此问题:
public delegate void MyEventHandle();
public delegate void AnotherEventHandle();
public interface class Interface
{
event MyEventHandler^ Event;
};
public ref class Class : public Interface …Run Code Online (Sandbox Code Playgroud) 调用特定事件的处理程序的顺序取决于该特定事件的实现。例如,使用多案例委托的默认后备存储,处理程序将按照它们注册的顺序被调用。但是类设计者/实现者可能使用add和remove关键字来为事件访问器提供不同的后备存储,因此调用顺序也会不同。
.NET 框架基础库本身是否存在事件文档准确描述其调用顺序的情况?无论是否存在,依赖于此类记录的命令是否被认为是可接受的做法(例如,对于我自己实施和记录的事件)?为什么或者为什么不?
在Form1的顶部,我做了:
private Process zipFileDirectoryProcess;
Run Code Online (Sandbox Code Playgroud)
在构造函数中我做了:
zipFileDirectoryProcess = new Process();
zipFileDirectoryProcess.StartInfo.FileName = "explorer.exe";
zipFileDirectoryProcess.StartInfo.CreateNoWindow = true;
zipFileDirectoryProcess.EnableRaisingEvents = true;
zipFileDirectoryProcess.Exited += new EventHandler(zipFileDirectoryProcess_Exited);
Run Code Online (Sandbox Code Playgroud)
然后我有一个方法,我从一个按钮点击事件调用它:
private void Compress()
{
zipFileDirectoryProcess.StartInfo.Arguments = zipFileDirectoryProcess.StartInfo.Arguments = "/select," + Path.GetFullPath(t);
zipFileDirectoryProcess.Start();
zipFileDirectoryProcess.WaitForExit();
this.TopMost = true;
}
Run Code Online (Sandbox Code Playgroud)
然后在底部退出事件:
private void zipFileDirectoryProcess_Exited(object sender, EventArgs e)
{
this.BeginInvoke(new MethodInvoker(delegate()
{
this.TopMost = false;
}));
}
Run Code Online (Sandbox Code Playgroud)
我想要做的只是当我在方法中启动它之后关闭进程窗口时才关闭窗口/进程然后执行Exited事件.
问题是,一旦过程在2-3秒后开始,它就会自动跳转到退出事件.
我该如何解决?尝试过的例子无法弄清楚.试图添加这一行:
zipFileDirectoryProcess.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
但没有效果.
有没有办法直接获取IntPtrMemoryMappedFile中的数据?我有大数据块,频率变化很大,我不想复制它