突然有一天,在iis服務(wù)器上上了一個(gè)新站點(diǎn)后,遠(yuǎn)程桌面網(wǎng)關(guān)連不上了。找不到原因,于是我把rpc和rpcwithcert兩個(gè)虛擬目錄給刪了。然后手動(dòng)配置
C:\Windows\System32\inetsrv\config\applicationHost.config文件,配了多次仍然不行。于是把rpc onver htpp proxy反復(fù)安裝,rpc和rpccert虛擬目錄完全沒(méi)任何變化,無(wú)論我是否建立還是刪除。
數(shù)日后我靈光一閃,會(huì)不會(huì)配置在注冊(cè)表里,在網(wǎng)上搜到到rpcproxy所在的注冊(cè)表目錄,hklm\software\microsoft\rpc\rpcprox,把此目錄刪除,再把iis中的虛擬目錄刪除。然后重裝rpc over http proxy,這貨終于給我自動(dòng)建產(chǎn)了rpc虛擬目錄。然后再裝遠(yuǎn)程桌面網(wǎng)關(guān),還是不行。瀏覽iis的rpc里的文件,報(bào)500.19錯(cuò)誤。上網(wǎng)查了下,有人說(shuō)是因?yàn)樵?4位系統(tǒng)里啟用了32位的設(shè)置引起的。于是我才恍然大悟,我上站點(diǎn)那天,新程序的功能只能在32位下跑,我把程序池改成32位的了。于是我把程序池改成64位的,再用遠(yuǎn)程桌面終端去連,終于見(jiàn)到久違的登錄界面,大功告成。
最近弄個(gè)項(xiàng)目,突然有點(diǎn)偏愛(ài)全局變量了,于是乎罔顧教科書(shū)的教誨,大用特用,一下就遇到了兩個(gè)問(wèn)題,茲記于此,以作教訓(xùn)。
1、由于搞某種設(shè)備的讀寫(xiě),針對(duì)每種設(shè)備寫(xiě)一個(gè)工廠類;然后聲明一個(gè)設(shè)備管理類的全局變量,在構(gòu)造函數(shù)里把工廠類全注冊(cè)到設(shè)備管理類中。后來(lái)覺(jué)得這樣不好,每加一種設(shè)備都要改構(gòu)造函數(shù)的代碼,于是我就寫(xiě)了一個(gè)注冊(cè)類,在構(gòu)造函數(shù)里進(jìn)行注冊(cè),然后在每個(gè)設(shè)備類的cpp里聲明注冊(cè)類的全局變量。
看起來(lái)很完美,于是我打了個(gè)lib,弄到另一個(gè)dll工程里編譯,結(jié)果就悲劇了,注冊(cè)類的構(gòu)造函數(shù)死活不運(yùn)行。最后發(fā)現(xiàn),編譯器認(rèn)為這個(gè)cpp的任何symbol都沒(méi)被引用,根本就不編譯進(jìn)來(lái),最后只好改回去。
2、而后我又在dll工程里聲明了一個(gè)全局變量,然后在全局變量的構(gòu)造函數(shù)里,調(diào)用設(shè)備類的全局變量的成員獲取設(shè)備列表,結(jié)果發(fā)現(xiàn)取出來(lái)是空的。最后發(fā)現(xiàn),設(shè)備類的構(gòu)造函數(shù)在取設(shè)備列表時(shí)還沒(méi)有被調(diào)用,把初始化的代碼移到MFC的app.InitInstance里調(diào)用解決問(wèn)題。
總結(jié)下:1、在c#、delphi里用得很順的工廠注冊(cè)類,在c++里是會(huì)被優(yōu)化掉的,千萬(wàn)用不得 2、任何情況下,不應(yīng)在全局變量的構(gòu)造函數(shù)里引用其他全局變量,這條應(yīng)該不限于c++。
最近搞了下openssl 的加密,做個(gè)mark,csdn這破貨用不起了
rsa生成密鑰對(duì)
void ConvertToArray(ostream& stream, const string& name, unsigned char* buf, size_t size)
{
stream << "const unsigned char " << name << "[" << size << "] = {" << endl;
for (size_t i = 0; i < size; i++)
{
if (i != 0)
stream << ",";
stream << (int)buf[i];
}
stream << endl << "};" << endl << endl;
}
void ConvertToArray(ostream& stream, const string &name, RSA* key, bool isPrivate)
{
int size = 0;
if (isPrivate)
size = i2d_RSAPrivateKey(key, NULL);
else
size = i2d_RSAPublicKey(key, NULL);
if (size < 0)
{
cout << "SaveRsKey error" << endl;
return;
}
unsigned char* prkey = new unsigned char[size + 20];
unsigned char *p = prkey;
if (isPrivate)
size = i2d_RSAPrivateKey(key, &p);
else
size = i2d_RSAPublicKey(key, &p);
if (size < 0)
{
cout << "SaveRsKey error" << endl;
}
else
{
ConvertToArray(stream, name, prkey, size);
}
delete[] prkey;
}
void SaveRSAKey(const string& fileName, RSA* key, bool isPrivate )
{
int size = 0;
if (isPrivate)
size = i2d_RSAPrivateKey(key, NULL);
else
size = i2d_RSAPublicKey(key, NULL);
if (size < 0)
{
cout << "SaveRsKey error" << endl;
return;
}
unsigned char* prkey = new unsigned char[size + 20];
unsigned char *p = prkey;
if (isPrivate)
size = i2d_RSAPrivateKey(key, &p);
else
size = i2d_RSAPublicKey(key, &p);
if (size < 0)
{
cout << "SaveRsKey error" << endl;
}
else
{
ofstream f(fileName.c_str(), ios_base::out | ios_base::binary);
if (!f)
{
cout << "SaveRsKey error" << endl;
}
else
{
//ConvertToArray()
f.write((char*)prkey, size);
f.close();
}
}
delete[] prkey;
}
void GenKeys()
{
ostringstream keys;
ofstream fpbtext("f:\\pbkeys.txt", ios_base::out);
ofstream fprtext("f:\\prkeys.txt", ios_base::out);
for (int i = 0; i < 10; i++)
{
ostringstream ps, ks, pn, kn;
ps << "f:\\key" << i << ".pbk";
pn << "pbk" << i;
ks << "f:\\key" << i << ".prk";
kn << "prk" << i;
RSA *key = RSA_generate_key(512, RSA_F4, NULL, NULL);
//SaveRSAKey(ps.str(), key, false);
//SaveRSAKey(ks.str(), key, true);
ConvertToArray(fpbtext, pn.str(), key, false);
ConvertToArray(fprtext, kn.str(), key, true);
RSA_free(key);
}
}
rsa加密和解密
unsigned char* prk = &prk0[0];
key = d2i_RSAPrivateKey(NULL, (const unsigned char**)&prk, sizeof(prk0));
//key = RSA_generate_key(512, RSA_F4, NULL, NULL);
plen = sizeof(ptext_ex) - 1;
num = RSA_private_encrypt(plen, ptext_ex, ctext, key,
RSA_PKCS1_PADDING);
if (num != RSA_size(key)) //模數(shù)長(zhǎng)度
{
printf("%d PKCS#1 v1.5 encryption failed:%s!\n", RSA_size(key), ERR_reason_error_string(ERR_get_error()));
err=1;
goto next;
}
//加密后的數(shù)據(jù)
printf("encrypted text: \n");
for (i = 0; i < num; i++)
{
printf("\\x%02x", ctext[i]);
}
printf("\n");
printf("RSA_private_encrypt num: %d\n", num);
RSA_free(key);
unsigned char* pbk = &pbk0[0];
key = d2i_RSAPublicKey(NULL, (const unsigned char**)&pbk, sizeof(pbk0));
num = RSA_public_decrypt(num, ctext, ptext, key,
RSA_PKCS1_PADDING);
if (num != plen || memcmp(ptext, ptext_ex, num) != 0)
{
printf("PKCS#1 v1.5 decryption failed!\n");
err=1;
}
else
printf("PKCS #1 v1.5 encryption/decryption ok\n");
printf("RSA_public_decrypt num: %d\n", num);
ptext[num] = '\0'; //字符串結(jié)尾
printf("ptext: %s\n", ptext);
RSA_free(key);
今兒突然想在cppblog發(fā)篇文章,
在firefox下寫(xiě)了半天,一提交說(shuō)內(nèi)容為空,再一回首,什么都成了虛無(wú),什么意思嘛,郁悶。