Tôi đã gặp vấn đề này khi chuyển đổi con trỏ C++/CLI thành con trỏ C++ gốc. Heres nền: Tôi đang viết một ứng dụng biểu mẫu cửa sổ bằng cách sử dụng C++/CLI. Ứng dụng này thực hiện cuộc gọi vào một số giao diện COM. Khi tạo một thể hiện (bên trong của một C++/CLR lớp) của một đối tượng thông qua giao diện COM, tôi vượt qua trong (void**)(&provider)
như là đối số cuối cùng để CoCreateInstance
, như trong:Chuyển đổi từ con trỏ C++/CLI sang con trỏ C++ bản địa
HRESULT CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, (void**)(&provider));
Tuy nhiên, tôi nhận được lỗi biên dịch: không thể chuyển đổi từ cli::interior_ptr<Type>
thành void **
. Tôi đã thực hiện một số nghiên cứu về vấn đề này và có vẻ như đó là vấn đề về các loại con trỏ khác nhau trong C++ và C++/CLI. Bất cứ ai có bất kỳ kiến thức về điều này, và có thể là một mẹo về cách nó có thể được cố định? Thanx trước!
Đầu tiên, thanx cho tất cả sự giúp đỡ của bạn!
Như Freich đã đề xuất, tôi đã cố gắng sử dụng pin_ptr
, nhưng thay vào đó, trình biên dịch này phàn nàn về các sự cố khi chuyển đổi từ interior_ptr
thành pin_ptr
. Nếu tôi thay vì cố gắng sử dụng interior_ptr
như trong:
pin_ptr<void *> pinnedPtr = &provider;
CoCreateInstance(CLSID_MSPRProvider, NULL, CLSCTX_LOCAL_SERVER, IID_IMSPRProvider, (void**)pinnedPtr);
tôi nhận được không thể chuyển đổi interior_ptr
-interior_ptr
. Tất cả điều này sẽ chuyển sang vấn đề chuyển đổi interior_ptr
thành void**
. Như thế này: (void**)interiorPtr
, trong đó interiorPtr
tất nhiên là interior_ptr
. Bất kỳ ý tưởng trong này?
Điều này có vẻ nguy hiểm! Tôi đã có một tình huống tương tự (hoặc tương tự) trước đây: Tôi đã tạo một con trỏ được ghim và trả về con trỏ nguyên gốc (như bạn làm), nhưng sau đó đối tượng đã được di chuyển vì hàm đã kết thúc và con trỏ được ghim đã bị xóa, vì vậy đối tượng không còn nữa được ghim và con trỏ gốc không hợp lệ! Điều này có thể hoặc có thể không được nhìn thấy trong khi gỡ lỗi, nhưng chắc chắn nó sẽ xảy ra trong phiên bản phát hành của bạn khi bạn không mong đợi nó. –
@TobiasKnauss constructor 'std :: string :: string (const char *)' tạo ra một bản sao của dữ liệu được tham chiếu, do đó, không sao nếu bộ nhớ tham chiếu không còn được ghim khi hàm thoát. –