我以前会问这个问题,但我在这里找不到......
我已经使用SWIG在C++类周围创建了一个JNI包装器.一切都很好,除了Java似乎永远不会调用类的finalize(),因此反过来,我的类的析构函数永远不会被调用.类的析构函数执行一些最终文件I/O,所以不幸的是,这不仅仅是一个小的内存泄漏.
通过Google搜索,似乎没有办法强制Java到GC并销毁对象.真正?
我知道我可以操作我的SWIG文件并创建一个可以调用C++析构函数的java函数,但是这个类被最终用户用在几种不同的平台/语言中,所以添加一个Java只会造成我们的技术不一致作家们不会喜欢.
我在64位XP机器上使用VS 2008.我正在通过控制台程序调试32位C++ DLL.DLL和EXE项目包含在同一个SLN中,因此我可以在测试时修改DLL.
会发生的是每隔一段时间我就用Debug调试程序 停止调试(Shift-F5).VS停止程序,但控制台窗口保持打开状态!如果我坐在一个断点并按下Shift-F5,它将正常终止,但如果程序在我停止时正在全速运行,我经常会看到它.
最大的问题是我无法关闭这些僵尸窗户.在任务管理器中使用"结束任务"不执行任何操作(无消息,无任何内容 当我关闭机器时,它无法由于孤儿,我不得不求助于实际关闭电源.
我认为这与将DLL和EXE项目放在同一个SLN中有关,就像我在2个VS实例中处理这个项目的几个月一样,一个用于DLL,另一个用于EXE.在我工作的时候,我会不断地在窗户之间来回跳跃.直到我将这两个项目放入单个SLN之后才发生这个问题.单个SLN工作得更好,但这种异常非常令人恼火.
任何人的想法?
UPDATE
经过一些搜索(这里),我发现它似乎与上周二的某个更新(KB977165或KB978037)有关.感谢Microsoft出色的预发布测试.
我想在运行时禁用或隐藏其中一个组件选项.我创建了一个带有两个单选按钮的自定义向导页面.如果选择了第一个单选按钮,我希望其中一个组件(CustomInstall)不显示,或者至少被禁用.
当然,自定义页面出现在"组件"页面之前.
我尝试使用Check:参数执行此操作,但似乎在启动时评估[Components]部分,而不是在显示页面时评估.
所以,我的下一个念头,就是一些代码添加到我的CurPageChanged(),这样我可以删除或禁用从CheckListBox(我认为这是所谓的ComopnentsList)的项目,但我找不到任何TNewCheckListBox文档.
有谁知道关于这门课程的更多信息?我的想法会起作用吗?
我正在尝试在多线程 C++ 程序中使用 SQLite 3.7.5。我把它缩小到几行简单的代码:
sqlite3 *Database;
sqlite3_stmt *Stmt;
int retval=sqlite3_open("database.db3",&Database);
retVal=sqlite3_prepare(&Database,"CREATE TABLE RawData (Key CHAR(5))",-1,&Stmt,0);
retval=sqlite3_step(Stmt);
retval=sqlite3_finalize(Stmt);
Run Code Online (Sandbox Code Playgroud)
当我直接从我的主进程调用此代码时,它工作正常。但是,如果我使用 CreateThread() 创建一个线程:
unsigned long ThreadId;
CreateThread(0,0,(LPTHREAD_START_ROUTINE) InserterThread,&Info,0,&ThreadId);
Run Code Online (Sandbox Code Playgroud)
我在sqlite3_step调用中收到“缓冲区溢出”Visual Studio 消息。如果我调试,我会看到崩溃位置在 dbgook.c 的 _CRT_DEBUGGER_HOOK 中。
我正在使用多线程静态 VC 库,并且正在使用定义进行编译:
SQLITE_THREADSAFE=2
THREADSAFE=2
Run Code Online (Sandbox Code Playgroud)
我已经用sqlite3_threadsafe()进行了验证。
我可以稍微追溯一下 SQLite 3 代码,但我希望有人会发现我的代码存在明显的问题并避免我的烦恼。
我创建了一个接口,我从另一个(COM)接口继承:
public interface IDTSComponentMetaData : IDTSComponentMetaData90 { }
Run Code Online (Sandbox Code Playgroud)
就是这样.
这背后的原因是,根据我正在使用的SQL Server版本,基数可能是IDTSComponentMetaData90(2005)或IDTSComponentMetaData100(2008).我不想在代码中有条件地编译对IDTSComponentMetaData90/IDTSComponentMetaData100的每个引用,而是使用版本中性接口,它将简单地包装正确的真实接口.
问题是SSIS在一个关键点将一个对象传递给本机接口,我需要将它转换为我的包装器接口:
#if SQL2005
public void Initialize(IDTSComponentMetaData90 c,IServiceProvider s) {
#elif SQL2008
public void Initialize(IDTSComopnentMetaData100 c,IServiceProvider s) {
#endif
m_ComponentMetaData = (IDTSComponentMetaData) c;
m_ServiceProvider = s;
}
Run Code Online (Sandbox Code Playgroud)
这没有问题编译,但在运行时,我得到一个'无法将类型'System .__ ComObject'的COM对象转换为接口类型'MyNameSpace.IDTSComponentMetaData'.此操作失败,因为对IID为"{483E01E7-001C-35E4-Ac9f-4B0C1B81E409}"的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) .
我做的完全错了吗?
我对WCF有点新意,我不认为我完全理解DataContracts的交易.我有这个'RequestArray'类:
[DataContract]
public class RequestArray
{
private int m_TotalRecords;
private RequestRecord[] m_Record;
[System.Xml.Serialization.XmlElement]
[DataMember]
public RequestRecord[] Record
{
get { return m_Record; }
}
[DataMember]
public int TotalRecords
{
get { return m_TotalRecords; }
set {
if (value > 0 && value <= 100) {
m_TotalRecords = value;
m_Record = new RequestRecord[value];
for (int i = 0; i < m_TotalRecords; i++)
m_Record[i] = new RequestRecord();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个想法是当客户端说requestArray.TotalRecords=6;
Record阵列将被分配和初始化时(我意识到我隐藏了一个分配后面的实现,这是我无法控制的).
问题是当客户端执行此操作时,不会调用TotalRecord的设置代码,服务中的断点也会确认.相反,已经生成了某种通用的setter而是被调用.如何让客户端使用我的setter?
编辑:看起来我并没有完全了解[DataContract]的工作原理,但客户端不会执行此代码是有道理的.就像我在评论中提到的那样,如果我'手动'执行setter的工作,我会看到设置代码在我调用服务函数时正确执行.
序列化我还不确定.RequestRecord []数组的内容不会被转移.Record类有setter/getters,我觉得我需要一个辅助函数来帮助它序列化整个类.
感谢你的帮助!
使用C#,我需要从几个AppSettings构建一个连接字符串.如果我这样做:
Connection = string.Format("Data Source={0};Initial Catalog={1);User Id={2};Password={3};",
ConfigurationManager.AppSettings.Get("CartServer"),
ConfigurationManager.AppSettings.Get("CartDatabase"),
ConfigurationManager.AppSettings.Get("CartUserName"),
ConfigurationManager.AppSettings.Get("CartPassword"));
Run Code Online (Sandbox Code Playgroud)
我得到一个无效的格式字符串异常.我把它缩小到格式字符串的"Password ="部分(即"Passwork ="工作).有一个简单的解决方法:
Connection = string.Format("Data Source={0};Initial Catalog={1);User Id={2};{3}={4};",
ConfigurationManager.AppSettings.Get("CartServer"),
ConfigurationManager.AppSettings.Get("CartDatabase"),
ConfigurationManager.AppSettings.Get("CartUserName"),
"Password",ConfigurationManager.AppSettings.Get("CartPassword")); // Lame!!!
Run Code Online (Sandbox Code Playgroud)
但是"密码"的真实故事是什么?我检查了MSDN和其他一些网站但是空了.哦,如果重要的话,这是一个WCF服务.
假设我有2个类,A类和B类.A类创建一个B类实例.A类有一个函数,我想从B类传递给一个方法.
class A {
void Main(string[] args) {
B classB=new B();
DelegateCaller(new delFunction(classB.TheFunction()); // <-- Won't compile (method name expected)
DelegateCaller(new delFunction(B.TheFunction()); // <-- Won't compile (object reference is req'd)
}
public delegate string delFunction();
public DelegateCaller(delFunction func) {
System.Console.WriteLine(func());
}
}
class B {
public string TheFunction() {
return "I'm Printing!!!";
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定它是否是语法问题,或者它只是我不能做的事情.也许我需要在B中定义委托,但在A中引用它?什么B的这个指针?