線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:13907
推到 Plurk!
推到 Facebook!

讓人無言以對火冒三丈的 c++ builder x64 compiler

 
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-12-14 22:54:52 IP:60.248.xxx.xxx 訂閱
今天拿到c++ builder 包含C++ x64 compiler的update
耗了快一個小時裝好
結果搞個一肚子火
狀況一:
new一個全新的project ,選擇x64然後compiler.............不能compile說找不到vcl.bpi.........弄好後又說找不到system.hpp
搞了好久,原來是tool->option裡面有關x64的環境根本是錯的..............XD
好吧!!!人非聖賢..........算不小心,無心之過吧

狀況二:
按下F9,竟然出現can't create process xxxx.exe ,挖哩 XXD
看一下是否有將exe給link出來,嗯!!!還好有..........
趕快看一下是不是64bit............程式跑起來,開啟process explorer看看.........不錯是64bit

狀況三:
這64bit還是有debug的需求,竟然無法按F9,那試試用attach process的方式看可不可以.
進入attach process 畫面,選擇x64 process attach.................阿!!!竟然給我xxxxxxx error(完整訊息我沒記)..............XXXD


以上從XD到XXXD,只讓我感覺,Embarcadero 在呼弄誰啊!!!
衝著C Builder XE3會有x64的支援,所以才升級............結果!!!

接下來再來試試 DLL...........現在已經有三個X了,希望不會再多下去..............


aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-12-15 22:29:27 IP:60.245.xxx.xxx 訂閱
HELLO

我有參與embarcadero的64bit測式。因簽了nda,所以不能講很多,但,我從beta1到beta11裡做一些測式,沒感覺有那麼多的問題。不過,最後的update1我還沒時間裝,但應該差不多才是。

f9去run的事,我從來沒遇到有問題,不知為何你會發生…? 是否可以把整個xe3裝到一個clean的vm或機器上試看看,我想你是power user,應該有裝不少的版本或是不同的開發平台。

我測的整個過程,僅dll的link上有些問題,但已經解決。其中最主要的差異是 64bit的 object format 是 混合式elf64格式,若要與外部連結需要一點技術。因為ms目前64bit是用pe 的格式。

如果有必要也可以請你把問題往官方送看看,加入他們的論討區,問題應該可以解決吧…


===================引 用 jcjroc 文 章===================
今天拿到c builder 包含C x64 compiler的update
耗了快一個小時裝好
結果搞個一肚子火
狀況一:
new一個全新的project ,選擇x64然後compiler.............不能compile說找不到vcl.bpi.........弄好後又說找不到system.hpp
搞了好久,原來是tool->option裡面有關x64的環境根本是錯的..............XD
好吧!!!人非聖賢..........算不小心,無心之過吧

狀況二:
按下F9,竟然出現can't create process xxxx.exe ,挖哩 XXD
看一下是否有將exe給link出來,嗯!!!還好有..........
趕快看一下是不是64bit............程式跑起來,開啟process explorer看看.........不錯是64bit

狀況三:
這64bit還是有debug的需求,竟然無法按F9,那試試用attach process的方式看可不可以.
進入attach process 畫面,選擇x64 process attach.................阿!!!竟然給我xxxxxxx error(完整訊息我沒記)..............XXXD


以上從XD到XXXD,只讓我感覺,Embarcadero 在呼弄誰啊!!!
衝著C Builder XE3會有x64的支援,所以才升級............結果!!!

接下來再來試試 DLL...........現在已經有三個X了,希望不會再多下去..............


------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-12-16 13:22:45 IP:60.248.xxx.xxx 訂閱
沒錯,我用了多種的開發環境,但主要都是MS&Intel,但沒影響吧!!!
update 1安裝時他會直接remove舊版再裝新的,我不介意手動清除舊版的資訊,但如何清哪(xp我清過)???
win7&win8該清那些reg&folder???可否告知!!!

DLL Link???
你指的是用Lib 做DLL Static load嗎???
如果是,那倒不成問題,因為我從來不用DLL Static load方式Load DLL,我都是用Dynamic Loda的方式,直接使用loadlibrary&GetProcAddres的方式來使用DLL

PS:我的開發機的OS是win8 x64 ent,不會跟我說"喔!!!抱歉只能使用win7",那會殺人的...........因為跟MS有簽約,公司大到老闆小到蟑螂,工作電腦的OS&office必須是MS所提供的最新版本.


編輯記錄
jcjroc 重新編輯於 2012-12-15 22:28:20, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-12-17 03:51:12 IP:114.44.xxx.xxx 訂閱
很好,

我個人還沒時間與機會測在win8上跑,但聽你這樣講,怎麼覺得有一點小可能。因我beta幫測的時候都用win7…

看誰有時間,幫忙測win8吧,或是你有時間的話也可以測一下在乾淨的win7上跑看看。

原則上,這樣有規模的公司,理當update時會做一些"基本"的測式,但…若依你的情形描述,這樣真的很慘,不太像會release出來update的樣子,沒人想被罵吧? 連debug都不行的話,真的可以x到拉圾桶了!

所以…所以…win8的問題可能性好像比較高,因必竟這時候win8還沒那麼流行,我想他們公司的rd應該主要會用win7吧…


===================引 用 jcjroc 文 章===================


PS:我的開發機的OS是win8 x64 ent,不會跟我說"喔!!!抱歉只能使用win7",那會殺人的...........因為跟MS有簽約,公司大到老闆小到蟑螂,工作電腦的OS&office必須是MS所提供的最新版本.


------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
Highlander
初階會員


發表:0
回覆:40
積分:43
註冊:2008-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-12-17 20:19:34 IP:180.177.xxx.xxx 訂閱
 不會啊, 我正在Win8 Pro的VM中使用C++Builder XE3 Update1, 完全沒有你說的問題. 應該是你本身機器環境的問題.

你有使用管理員權限執行XE3嗎?
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-12-17 21:19:28 IP:60.248.xxx.xxx 訂閱
真的是................

狀況一:
轉換平台(x86 to x64)絕大部分應該都是無痛的,但為啥是痛痛痛

例一
Fun(L"123");


紅色部分出警告
例二
#if defined( __BORLANDC__) ||defined(__INTEL_COMPILER)
#define __INTERFACE interface
#else ifdef _MSC_VER
#if _MSC_VER<1300
#define __INTERFACE interface
#else
#define __INTERFACE __interface
#endif
#include "objidl.h"
#endif

紅色部分出錯誤
例三
#ifdef _TYPENAME
#undef _TYPENAME
#endif
#ifndef __BORLANDC__
#define _TYPENAME typename
#else
#define _TYPENAME
#endif
namespace DropInterfaceImplementLib
{
template class TDropEvent:public PublicInterfaceTLB::IDropEvent
{
public:
static void WINAPI CreateTDropEvent(
typename T>** p_TDropEventPtrPtr
)
{
try
{
p_TDropEventPtrPtr[0]=new DropInterfaceImplementLib::TDropEvent(p_ObjectPtr);
}
catch(...)
{
}
}

紅色部分出錯誤
狀況三
為何Library預設副檔名為 .a

#ifdef __BORLANDC__
#pragma link "TransmissionLib.lib"
#pragma link "TransmissionTLB_Lib.lib"
#endif

我還得定義x64不同的lib link,是否有點扯

我的程式碼除UI部分,其他絕大部分都須符合不同compiler的需求,為何不管intel or visual studio 都是無痛,反觀 c builder 卻是如此.
不同廠商的compiler語法會有所差異我同意,但Embarcadero 是否有太扯了點,還是有其他讓我信服的理由.
繼續累積X,目前已到六個........不知集滿十個有沒有獎品換

PS:今天我remove所有Embarcadero 的product ,包含相關Registry 與folder,然後用iso重裝,之前的問題依舊.


===================引 用 aftcast 文 章===================
很好,

我個人還沒時間與機會測在win8上跑,但聽你這樣講,怎麼覺得有一點小可能。因我beta幫測的時候都用win7…

看誰有時間,幫忙測win8吧,或是你有時間的話也可以測一下在乾淨的win7上跑看看。

原則上,這樣有規模的公司,理當update時會做一些"基本"的測式,但…若依你的情形描述,這樣真的很慘,不太像會release出來update的樣子,沒人想被罵吧? 連debug都不行的話,真的可以x到拉圾桶了!

所以…所以…win8的問題可能性好像比較高,因必竟這時候win8還沒那麼流行,我想他們公司的rd應該主要會用win7吧…


===================引 用 jcjroc 文 章===================


PS:我的開發機的OS是win8 x64 ent,不會跟我說"喔!!!抱歉只能使用win7",那會殺人的...........因為跟MS有簽約,公司大到老闆小到蟑螂,工作電腦的OS&office必須是MS所提供的最新版本.



jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-12-17 21:23:58 IP:60.248.xxx.xxx 訂閱
你是compiler x64然後debug嗎?

x86是沒問題............

我是用administrator身分login

===================引 用 Highlander 文 章===================
不會啊, 我正在Win8 Pro的VM中使用C Builder XE3 Update1, 完全沒有你說的問題. 應該是你本身機器環境的問題.

你有使用管理員權限執行XE3嗎?
Highlander
初階會員


發表:0
回覆:40
積分:43
註冊:2008-10-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2012-12-18 11:25:57 IP:180.177.xxx.xxx 訂閱
是啊, 我是Win 8 Pro 64bit, 用32bit 和64bit debug都沒問題, VCL 32/64, FM2 32/64 debug都沒問題.

===================引 用 jcjroc 文 章===================
你是compiler x64然後debug嗎?

x86是沒問題............

我是用administrator身分login

===================引 用 Highlander 文 章===================
不會啊, 我正在Win8 Pro的VM中使用C Builder XE3 Update1, 完全沒有你說的問題. 應該是你本身機器環境的問題.

你有使用管理員權限執行XE3嗎?
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2012-12-18 12:13:45 IP:114.42.xxx.xxx 訂閱
我想,你真的是power user,以前我看你的程式就知道,你的寫作方式像綀高級內功,所以第一次認出你就只因為看到你在網路上的程式碼,馬上就知道是你,太有特色了,無論如何可以稍簡單處裡的東西,如c/c++ lib的fopen,你都要計較用純api來處理…快幾個clocks的指令??!

言歸正傳,是否可以把錯誤/warnning 的訊息貼出來,以方便找問題? 我是看到幾個可能的情形。我先回一下,其他的可能需要error/warnning msg才可以了解。

1/ BSTR的問題,我想這裡應該要嚴僅一點的才對,因為 vcl裡面對應到 BSTR的字元結構指標是 WideString。而, L"123" 認真講是 wchar_t[ ],寛字元陣列/指標,但這與BSTR是不相同的東西,簡單說,BSTR的結構中含有長度資訊(若我記得沒錯的話),但純wchar_t的字串是不會有的。所以,你請compiler幫你轉這樣的型別是「可能」會出問題的,因此,warnning你應該是需要的。若要嚴僅,理當寫 Fun(WideString(L"123"));

2/ LIB為何是 .a ?因為他的objective format 變成 elf64的格式,這種格式一般是unix類在用的,所以是 .a 。至於ms編出來的lib當然是 pe 的格式。但僅管 obj 是 elf64,經link後,還是會變成 pe 的exe檔 (啊不然怎麼在windows上run,你說是吧)。在此還要特別和你說,因為你是power user,你常會做別人不會做的事…就是別想把 vc/intel c 編好的obj (lib)拿來和bc64 link。我知道你不會把class的obj拿來link,但怕你會想把純c function 的靜態lib 從 vc 編好後拿來link。總之,因為 elf64 與 pe 的obj 是無法link一起的,請注意就是。

另typname的問題,要看訊息,不過我好奇的是你還要用macro來定義? 這是標準的關鍵字很久了,不支援的都是很老的compiler了,或者,你心狠一點,都用class關鍵字來取代,雖然…很少部份的情形會有問題。若我記得沒錯的話, typename也是一個歷史問題來的…

#if defined() || defined() 這樣的寫法會有問題,我是沒試,但好詭異,是什麼錯誤訊息?


以上,因近來比較沒時間處理windows 程式,忙於 objective c 與 java 的開發,所以沒再去google資料,也沒寫code來測式,都靠記憶回你。細節也許會有誤,還請見諒!

ps : debug (按 f9 ) 我是都不曾發生過問題…完全不清楚是怎麼搞的…
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2012-12-17 21:28:30, 註解 無‧
Highlander
初階會員


發表:0
回覆:40
積分:43
註冊:2008-10-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2012-12-18 12:15:19 IP:180.177.xxx.xxx 訂閱
void WINAPI Fun(const BSTR p_StrPtr);

這本就是舊式C/C 的寫法, 新的LLVM Compiler更符合ANSI/ISO標準, 對語法的要求更嚴格, 這些已經過時的語法新的compiler幫你找出來, 要你把它更正是好事, 為什麼你會以負面來看它?

例二
#ifdef __INTERFACE
#undef __INTERFACE
#endif
我幫你試了沒問題不知你為何有問題, 只是在64bit compiler中沒有定義
我無法試, 因沒source, 你應該再冷靜看看你的程式碼

狀況三
為何Library預設副檔名為 .a

#ifdef __BORLANDC__
#pragma link "TransmissionLib.lib"
#pragma link "TransmissionTLB_Lib.lib"
#endif

我還得定義x64不同的lib link,是否有點扯

另外你的#define是不太正確的, 新的64 bit compiler已經不是舊的Borland C/C compiler, __BORLANDC__雖然仍然有定義, 但這樣使用是不盡正確的, 其實不管32 bit 或是 64bit compiler, 你只需要寫:

即可, 你的compiler會自動加上正確的副檔名


我的程式碼除UI部分,其他絕大部分都須符合不同compiler的需求,為何不管intel or visual studio 都是無痛,反觀 c builder 卻是如此.
不同廠商的compiler語法會有所差異我同意,但Embarcadero 是否有太扯了點,還是有其他讓我信服的理由.
繼續累積X,目前已到六個........不知集滿十個有沒有獎品換
void WINAPI Fun(const BSTR p_StrPtr);

#ifdef __INTERFACE
#undef __INTERFACE
#endif
typename T* p_ObjectPtr,
DropInterfaceImplementLib::TDropEvent<typename T>** p_TDropEventPtrPtr
)
{
try
{
p_TDropEventPtrPtr[0]=new DropInterfaceImplementLib::TDropEvent(p_ObjectPtr);
}
catch(...)
{

}
}

紅色部分出錯誤
狀況三
為何Library預設副檔名為 .a

#ifdef __BORLANDC__
#pragma link "TransmissionLib.lib"
#pragma link "TransmissionTLB_Lib.lib"
#endif

我還得定義x64不同的lib link,是否有點扯

我的程式碼除UI部分,其他絕大部分都須符合不同compiler的需求,為何不管intel or visual studio 都是無痛,反觀 c builder 卻是如此.
不同廠商的compiler語法會有所差異我同意,但Embarcadero 是否有太扯了點,還是有其他讓我信服的理由.
繼續累積X,目前已到六個........不知集滿十個有沒有獎品換

PS:今天我remove所有Embarcadero 的product ,包含相關Registry 與folder,然後用iso重裝,之前的問題依舊.


===================引 用 aftcast 文 章===================
很好,

我個人還沒時間與機會測在win8上跑,但聽你這樣講,怎麼覺得有一點小可能。因我beta幫測的時候都用win7…

看誰有時間,幫忙測win8吧,或是你有時間的話也可以測一下在乾淨的win7上跑看看。

原則上,這樣有規模的公司,理當update時會做一些"基本"的測式,但…若依你的情形描述,這樣真的很慘,不太像會release出來update的樣子,沒人想被罵吧? 連debug都不行的話,真的可以x到拉圾桶了!

所以…所以…win8的問題可能性好像比較高,因必竟這時候win8還沒那麼流行,我想他們公司的rd應該主要會用win7吧…


===================引 用 jcjroc 文 章===================


PS:我的開發機的OS是win8 x64 ent,不會跟我說"喔!!!抱歉只能使用win7",那會殺人的...........因為跟MS有簽約,公司大到老闆小到蟑螂,工作電腦的OS&office必須是MS所提供的最新版本.



qcom
版主


發表:79
回覆:114
積分:43
註冊:2011-05-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2012-12-18 12:41:55 IP:61.219.xxx.xxx 訂閱
我們用VM Win8 環境詳細測試 CBXE3 32bit 與64bit, 所有功能與運作完全正常, 可能是你沒有un-install 舊版本或太複雜的工作環境所造成的, 請熄火冷靜再double check ㄧ下.
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2012-12-18 13:17:01 IP:59.124.xxx.xxx 訂閱

可以協助解決嗎???
我已經沒步了.........

===================引 用 qcom 文 章===================
我們用VM Win8 環境詳細測試 CBXE3 32bit 與64bit, 所有功能與運作完全正常, 可能是你沒有un-install 舊版本或太複雜的工作環境所造成的, 請熄火冷靜再double check ㄧ下.
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#13 引用回覆 回覆 發表時間:2012-12-18 13:51:59 IP:59.124.xxx.xxx 訂閱
呵呵!!我一切崇尚自然................
至於手法...........那是習慣
不用c lib的檔案函式,那是因為1.API已經很熟了2.被其他的compiler害過3.還有其他考量

其實c builder一般我都只拿來做UI,其他程式全都是能跨不同c compiler,至於不同compiler互相使用object的問題,我是透過COM interface 來解決

我會那麼在意語法問題,主要是因為我的SDK有其他廠商在用,Embarcadero 這樣的方式會搞得所有人人仰馬翻.


一.
void WINAPI Fun(const BSTR p_StrPtr);

BSTR只是一個wchar_t* 沒有邊界的

二.
lib當然有分哪個compiler產生的,我的應用,就算是同一家compiler,不同版本也是分開的
VC 的 lib 給 CB用.......傻了吧!!!就算同家但不同版本拿來混用,想死比較快

三.
typname 那是為了更明確指定用的,沒辦法不同compiler在導template時總有些不同的問題,所以才會如此寫

四.
#ifdef __INTERFACE
#undef __INTERFACE
#endif
#if defined( __BORLANDC__) || defined( __INTEL_COMPILER)
#define __INTERFACE interface
#elif _MSC_VER
#if _MSC_VER<1300
#define __INTERFACE interface
#else
#define __INTERFACE __interface
#endif
#include "objidl.h"
#endif

差在#else ifdef 不可用,只能用#elif

五.
#pragma link "TransmissionLib.lib"
#pragma link "TransmissionTLB_Lib.lib"
改成
#pragma link "TransmissionLib"
#pragma link "TransmissionTLB_Lib"
這不是只link obj







===================引 用 aftcast 文 章===================
我想,你真的是power user,以前我看你的程式就知道,你的寫作方式像綀高級內功,所以第一次認出你就只因為看到你在網路上的程式碼,馬上就知道是你,太有特色了,無論如何可以稍簡單處裡的東西,如c/c lib的fopen,你都要計較用純api來處理…快幾個clocks的指令??!

言歸正傳,是否可以把錯誤/warnning 的訊息貼出來,以方便找問題? 我是看到幾個可能的情形。我先回一下,其他的可能需要error/warnning msg才可以了解。

1/ BSTR的問題,我想這裡應該要嚴僅一點的才對,因為 vcl裡面對應到 BSTR的字元結構指標是 WideString。而, L"123" 認真講是 wchar_t[ ],寛字元陣列/指標,但這與BSTR是不相同的東西,簡單說,BSTR的結構中含有長度資訊(若我記得沒錯的話),但純wchar_t的字串是不會有的。所以,你請compiler幫你轉這樣的型別是「可能」會出問題的,因此,warnning你應該是需要的。若要嚴僅,理當寫 Fun(WideString(L"123"));

2/ LIB為何是 .a ?因為他的objective format 變成 elf64的格式,這種格式一般是unix類在用的,所以是 .a 。至於ms編出來的lib當然是 pe 的格式。但僅管 obj 是 elf64,經link後,還是會變成 pe 的exe檔 (啊不然怎麼在windows上run,你說是吧)。在此還要特別和你說,因為你是power user,你常會做別人不會做的事…就是別想把 vc/intel c 編好的obj (lib)拿來和bc64 link。我知道你不會把class的obj拿來link,但怕你會想把純c function 的靜態lib 從 vc 編好後拿來link。總之,因為 elf64 與 pe 的obj 是無法link一起的,請注意就是。

另typname的問題,要看訊息,不過我好奇的是你還要用macro來定義? 這是標準的關鍵字很久了,不支援的都是很老的compiler了,或者,你心狠一點,都用class關鍵字來取代,雖然…很少部份的情形會有問題。若我記得沒錯的話, typename也是一個歷史問題來的…

#if defined() || defined() 這樣的寫法會有問題,我是沒試,但好詭異,是什麼錯誤訊息?


以上,因近來比較沒時間處理windows 程式,忙於 objective c 與 java 的開發,所以沒再去google資料,也沒寫code來測式,都靠記憶回你。細節也許會有誤,還請見諒!

ps : debug (按 f9 ) 我是都不曾發生過問題…完全不清楚是怎麼搞的…
編輯記錄
jcjroc 重新編輯於 2012-12-18 00:30:19, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#14 引用回覆 回覆 發表時間:2012-12-18 17:07:57 IP:60.245.xxx.xxx 訂閱
Fun(L"123");


剛去google證實了一下我老人的記憶沒錯 :

http://zh.wikipedia.org/zh-tw/BSTR


所以你的理解不完全正確! 沒邊界是沒錯,但重點在有個管理的區塊。 若你僅當他是一個 null terminated string,而少了那個區塊,很可能在造成一些「現有的api」在讀寫時出錯(因為那一個管理長度的區塊是垃圾)。

這就是為何 vcl 裡要有個叫 WideString的物件來由,因為除了提供一些方法外,最重要的是他可以() ,不然請用



lib當然有分哪個compiler產生的,我的應用,就算是同一家compiler,不同版本也是分開的
你這樣說也是普通正確,但也不完全就要這麼擔心,想想我們經過的dos時代,經常不就是 turbo c / msc 與 tasm ,masm 相互可以link在一起。因為
1/ objective format 都是一樣的,即 omf 格式
2/ calling convention 是一樣的都是 cdecl

turbo c 與 msc 的obj 相link就不說了,肯定沒問題。若拿不同的組語來link,只要calling convention有注意,stack的push/pop對的,那asm編出來的也是可和不同的asm,c 而link在一起的。

而這樣的link的情形,即使在windows也是一樣的。也是只要符合上述二點,且是純 c 語言的碼,都不會有問題!






------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2012-12-18 02:17:35, 註解 無‧
aftcast 重新編輯於 2012-12-18 02:25:12, 註解 無‧
aftcast 重新編輯於 2012-12-18 02:28:00, 註解 無‧
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#15 引用回覆 回覆 發表時間:2012-12-18 19:38:29 IP:59.124.xxx.xxx 訂閱
關於BSTR,你講的也算對
但其實它會有問題是在使用BSTR 專用API才會問題,因為長度是擺在BSTR 向前4byte
這也就是為何針對COM 的呼叫直接傳入PWSTR基本上是可以的,取決於COM裡面有沒使用BSTR API對傳入的記憶體作動
再看看BSTR 的定義是typedef出來的,最終指向 wchar_t*
所以BSTR的運用基本上可以看作是雙方協議.

接下來lib的問題,還真的只能
#pragma link "TransmissionLib.a"
#pragma link "TransmissionTLB_Lib.a"
暈了

至於aftcast說的 lib共用問題,那僅止於純C
可是如果有class,那乖點吧!!!我吃過虧
所以一切單一化,根據compiler版本吧!!!
不然出事了吃不完兜著走......
才疏學淺,又無福消受天上掉下來的禮物,只好用笨方法來躲避問題


另!!大家x64可以debug,應該都是裝rad吧!!!(delphi & CB)
我只裝CB而已
我看了一些資料,也看了Process Explorer,發現x64debug應該是透過rmtdbg170.exe來達成的(跟VC同樣的手法),
http://docwiki.embarcadero.com/RADStudio/XE3/en/Installing_a_Debugger_on_a_Remote_Machine
根據資料我少了dcc64.dll for a Win64 system
但如何重裝都沒有,當然這只是猜測....
如果猜測是對的,但rmtdbg170.exe卻是32bit的程式,32bit程是可以attach 64bit的程式嗎?






===================引 用 aftcast 文 章===================
Fun(L"123");


剛去google證實了一下我老人的記憶沒錯 :

http://zh.wikipedia.org/zh-tw/BSTR


所以你的理解不完全正確! 沒邊界是沒錯,但重點在有個管理的區塊。 若你僅當他是一個 null terminated string,而少了那個區塊,很可能在造成一些「現有的api」在讀寫時出錯(因為那一個管理長度的區塊是垃圾)。

這就是為何 vcl 裡要有個叫 WideString的物件來由,因為除了提供一些方法外,最重要的是他可以() ,不然請用



lib當然有分哪個compiler產生的,我的應用,就算是同一家compiler,不同版本也是分開的
你這樣說也是普通正確,但也不完全就要這麼擔心,想想我們經過的dos時代,經常不就是 turbo c / msc 與 tasm ,masm 相互可以link在一起。因為
1/ objective format 都是一樣的,即 omf 格式
2/ calling convention 是一樣的都是 cdecl

turbo c 與 msc 的obj 相link就不說了,肯定沒問題。若拿不同的組語來link,只要calling convention有注意,stack的push/pop對的,那asm編出來的也是可和不同的asm,c 而link在一起的。

而這樣的link的情形,即使在windows也是一樣的。也是只要符合上述二點,且是純 c 語言的碼,都不會有問題!






編輯記錄
jcjroc 重新編輯於 2012-12-18 19:34:54, 註解 無‧
jcjroc 重新編輯於 2012-12-18 19:35:33, 註解 無‧
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#16 引用回覆 回覆 發表時間:2012-12-19 21:10:07 IP:60.248.xxx.xxx 訂閱
終於抓到
今天下載RAD 試用版,完整安裝(CB&Delphi)
cb x64可以debug ,用process explorer看一下,debug是靠dbkw64_17_0.exe(64bit)達成的
可是我用正式版安裝cb xe3 pro卻找不到這個程式,
不知這可不可算是原廠的問題?????



aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#17 引用回覆 回覆 發表時間:2012-12-20 14:45:30 IP:114.32.xxx.xxx 訂閱
hello,

你正式版是 cb xe3 pro 嗎? 從update 的網站上看好像是有support。如果說你的版本是列在那update的list裡,然後確定不行,那就請經銷商出面幫你解決了…

看你是和哪家買的,是捷康或興德,找他們看如何處理吧!

===================引 用 jcjroc 文 章===================
終於抓到
今天下載RAD 試用版,完整安裝(CB&Delphi)
cb x64可以debug ,用process explorer看一下,debug是靠dbkw64_17_0.exe(64bit)達成的
可是我用正式版安裝cb xe3 pro卻找不到這個程式,
不知這可不可算是原廠的問題?????



------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#18 引用回覆 回覆 發表時間:2012-12-20 21:44:12 IP:60.248.xxx.xxx 訂閱
沒法度啦
最新測試結果,win8 pro沒問題
win8 ent 按F9就是只會run rmtdbg170.exe
dbkw64_17_0.exe 在其他版本,都可以獨立run
單單win8 ent就沒辦法run,每次run就曇花一現
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#19 引用回覆 回覆 發表時間:2013-01-21 07:41:47 IP:60.248.xxx.xxx 訂閱
問題解決了
關鍵是 我的電腦有 desktop dock,該程式會hook 所有程式的mouse message, dbkw64_17_0.exe會因此自動結束
IDE 於是使用 rmtdbg170.exe ,但 rmtdbg170.exe 無法debug 64bit的程式............於是乎

感謝各位的幫忙

怎找不到結案按鈕阿
編輯記錄
jcjroc 重新編輯於 2013-01-20 16:43:59, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#20 引用回覆 回覆 發表時間:2013-01-21 09:58:47 IP:114.32.xxx.xxx 訂閱
找到真象就好,這種真象我看也只有你這樣程度的人才找得到!

可能是因為你是「討論」,而非「問題」的關係,所以結不了案… anyway,大家看到此就應該了解結案了。

===================引 用 jcjroc 文 章===================
問題解決了
關鍵是 我的電腦有 desktop dock,該程式會hook 所有程式的mouse message, dbkw64_17_0.exe會因此自動結束
IDE 於是使用 rmtdbg170.exe ,但 rmtdbg170.exe 無法debug 64bit的程式............於是乎

感謝各位的幫忙

怎找不到結案按鈕阿
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#21 引用回覆 回覆 發表時間:2013-01-28 21:45:19 IP:60.248.xxx.xxx 訂閱
我只是愛搞............程度粉低的

只是話說回來dbkw64_17_0.exe也搞保護阿???


===================引 用 aftcast 文 章===================
找到真象就好,這種真象我看也只有你這樣程度的人才找得到!

可能是因為你是「討論」,而非「問題」的關係,所以結不了案… anyway,大家看到此就應該了解結案了。

===================引 用 jcjroc 文 章===================
問題解決了
關鍵是 我的電腦有 desktop dock,該程式會hook 所有程式的mouse message, dbkw64_17_0.exe會因此自動結束
IDE 於是使用 rmtdbg170.exe ,但 rmtdbg170.exe 無法debug 64bit的程式............於是乎

感謝各位的幫忙

怎找不到結案按鈕阿
系統時間:2024-04-23 22:35:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!